私が持っています:
_var keys = [ "height", "width" ];
var values = [ "12px", "24px" ];
_
そして、私はそれをこのオブジェクトに変換したいと思います:
_{ height: "12px", width: "24px" }
_
Pythonには、単純なイディオムdict(Zip(keys,values))
があります。 jQueryまたはプレーンJavascriptに似たようなものはありますか、それともこれを長い道のりで行う必要がありますか?
単純なJS関数は次のようになります。
function toObject(names, values) {
var result = {};
for (var i = 0; i < names.length; i++)
result[names[i]] = values[i];
return result;
}
もちろん、JSはこれらの関数型言語主義を容易にする高階型をサポートしているため、Zipなどの関数を実際に実装することもできます:D
Array reduce
を使用した最も単純なES6ワンライナーソリューション:
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);
2つの配列を 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);
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;
}
//...