2つの配列があり、1つはキー、もう1つは値です。
keys = ['foo', 'bar', 'qux']
values = ['1', '2', '3']
どのようにそれをオブジェクトに変換しますか underscore.js methods のみを使用して?
{
foo: '1',
bar: '2',
qux: '3'
}
私は単純なjavascriptの答え( このように )を探していません。
これは個人的な練習としてお願いします。アンダースコアにはこれを正確に実行する方法があると思いましたが、それができないことを確認するだけでした。答えはありますが、かなりの数の操作が必要です。どうしますか
使用する必要があるのは、アンダースコアjsの _。object メソッドです。 underscore.jsのバージョンにオブジェクトメソッドが存在しない場合は、このメソッドを手動で追加する必要があります。
keys = ['foo', 'bar', 'qux']
values = ['1', '2', '3']
_.object = function(list, values) {
if (list == null) return {};
var result = {};
for (var i = 0, l = list.length; i < l; i++) {
if (values) {
result[list[i]] = values[i];
} else {
result[list[i][0]] = list[i][1];
}
}
return result;
};
console.log(_.object(keys, values))
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>
Underscore.jsソリューションを求めていたのはわかっていますが、これには必要ありません。 ES7のオブジェクトスプレッドオペレーターと動的キーを使用するワンライナーは次のとおりです。
keys.reduce((obj, k, i) => ({...obj, [k]: values[i] }), {})
ES6の使用:
let numbers = [1, 2, 3],
names = ["John", "Mike", "Colin"];
let a = Object.assign({}, ...numbers.map((n, index) => ({[n]: names[index]})))
console.log(a);
どうですか:
keys = ['foo', 'bar', 'qux'];
values = ['1', '2', '3'];
some = {};
_.each(keys,function(k,i){some[k] = values[i];});
完全にするために:別のアプローチは次のようになります:
_.Zip(['foo', 'bar', 'qux'],['1', '2', '3'])
.map(function(v){this[v[0]]=v[1];}, some = {});
参考までに、アンダースコアなしでArray.prototypeを拡張できます。
Array.prototype.toObj = function(values){
values = values || this.map(function(v){return true;});
var some;
this .map(function(v){return [v,this.shift()]},values)
.map(function(v){this[v[0]]=v[1];},some = {});
return some;
};
// usage
var some = ['foo', 'bar', 'qux'].toObj(['1', '2', '3']);
jsfiddle を参照してください
これが4年前であり、Lodashが多かれ少なかれUnderscoreに取って代わったことを考えると、Lodashを使用してこの解決策を共有すると思いました:
var keys = ['foo', 'bar', 'qux'];
var values = ['1', '2', '3'];
var obj = _.zipObject( keys, values );
シンプルでクリーン。
var toObj = (ks, vs) => ks.reduce((o,k,i)=> {o[k] = vs[i]; return o;}, {});
var keys=['one', 'two', 'three'],
values = [1, 2, 3];
var obj = toObj(keys, values);
console.log(obj);
最もきれいです
keys = ['foo', 'bar', 'qux']
values = ['1', '2', '3']
function Arr2object(keys, vals) {
return keys.reduce(
function(prev, val, i) {
prev[val] = vals[i];
return prev;
}, {}
);
}
console.log(Arr2object(keys, values));
または、_.reduce
、ただしアンダースコアを使用している場合は、すでに_.object
。
探しているのはZip関数です。
編集:オブジェクトは作成しませんが、サブ配列を作成して配列を結合します
まさにあなたが望むことをする関数はありません。しかし、Zipの結果を使用してオブジェクトを作成できます。
var arr = _.Zip(['foo', 'bar', 'qux'], ['1', '2', '3']);
var i, len = arr.length;
var new_obj = [];
for(i=0; i<len; ++i)
new_obj[arr[i][0]] = arr[i][1];