قم بدمج صفيف المفاتيح والقيم صفيف في كائن في JavaScript

StackOverflow https://stackoverflow.com/questions/1117916

  •  12-09-2019
  •  | 
  •  

سؤال

لدي:

var keys = [ "height", "width" ];
var values = [ "12px", "24px" ];

وأود تحويله إلى هذا الكائن:

{ height: "12px", width: "24px" }

في بيثون، هناك المصطلح البسيط dict(zip(keys,values)). وبعد هل هناك شيء مشابه في JQuery أو عادي جافا سكريبت، أو هل يجب علي القيام بذلك عن الطريق الطويل؟

هل كانت مفيدة؟

المحلول

وظيفة JS بسيطة سيكون:

function toObject(names, values) {
    var result = {};
    for (var i = 0; i < names.length; i++)
         result[names[i]] = values[i];
    return result;
}

بالطبع، يمكنك أيضا تنفيذ وظائف مثل الرمز البريدي، وما إلى ذلك لأن JS يدعم أنواع الطلبات العالية التي تجعل هذه المعدات ISMs الوظيفية السهلة: D

نصائح أخرى

استخدام لوش.

_.zipobject.

مثال

_.zipObject(['a', 'b'], [1, 2]);
// ➜ { 'a': 1, 'b': 2 }

أبسط ES6 حل بطانة واحدة باستخدام الصفيف reduce:

const keys = ['height', 'width'];
const values = ['12px', '24px'];
const merged = keys.reduce((obj, key, index) => ({ ...obj, [key]: values[index] }), {});

كحل بديل، لم يذكر بالفعل على ما أعتقد:

  var result = {};
  keys.forEach((key, idx) => result[key] = values[idx]);

نهج وظيفي مع في الاعتبار في الاعتبار:

const zipObj = xs => ys => xs.reduce( (obj, x, i) => ({ ...obj, [x]: ys[i] }), {})

const arr1 = ['a', 'b', 'c', 'd']
const arr2 = ['e', 'f', 'g', 'h']

const obj = zipObj (arr1) (arr2) 

console.log (obj)

يمكنك استخدام reduce() وظيفة لتعيين أزواج القيمة الرئيسية إلى كائن.

/**
 *  Apply to an existing or new object, parallel arrays of key-value pairs.
 *
 *  @param   {string[]} keys      - List of keys corresponding to their accociated values.
 *  @param   {object[]} vals      - List of values corresponding to their accociated keys.
 *  @param   {object}   [ref={}]  - Optional reference to an existing object to apply to.
 *
 *  @returns {object} - The modified or new object with the new key-value pairs applied.
 */
function toObject(keys, vals, ref) {
  return keys.length === vals.length ? keys.reduce(function(obj, key, index) {
    obj[key] = vals[index];
    return obj;
  }, ref || {}) : null;
}

var keys   = [ "height" , "width" ];
var values = [ "12px"   , "24px"  ];

document.body.innerHTML = '<pre>' + JSON.stringify(toObject(keys, values), null, 2) + '</pre>';

function combineObject( keys, values)
{
    var obj = {};
    if ( keys.length != values.length)
       return null;
    for (var index in keys)
        obj[keys[index]] = values[index];
     return obj;
};


var your_obj = combine( your_keys, your_values);

في ال مشروع jquery-utils, ، ال Arrayutils. الوحدة النمطية لديها وظيفة ZIP تنفيذها.

//...
zip: function(object, object2, iterator) {
    var output = [];
    var iterator = iterator || dummy;
        $.each(object, function(idx, i){
        if (object2[idx]) { output.push([i, object2[idx]]); }
    });
    return output;
}
//...

يمكنك الجمع بين صفيفين مع map الطريقة، ثم تحويله Object.fromEntries.

var keys = ["height", "width"];
var values = ["12px", "24px"];

var array = keys.map(function(el, i) {
  return [keys[i], values[i]];
});
// → [["height", "12px"], ["width", "24px"]]

var output = Object.fromEntries(array);
// → {height: "12px", width: "24px"}
console.log(output);

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top