[英]Merge arrays of object with nested arrays of object using JS, lodash or Underscore
[英]merge two arrays of keys and values to an object using underscore
給定兩個數組,一個有鍵,一個有值:
keys = ['foo', 'bar', 'qux']
values = ['1', '2', '3']
您將如何僅使用 underscore.js 方法將其轉換為對象?
{
foo: '1',
bar: '2',
qux: '3'
}
我不是在尋找一個簡單的 javascript 答案( 像這樣)。
我問這是個人練習。 我認為下划線有一種方法可以做到這一點,結果卻發現它沒有,這讓我想知道是否可以做到。 我有一個答案,但它涉及相當多的操作。 你會怎么做?
我知道你要求 Underscore.js 解決方案,但你不需要它。 這是一個使用 ES7 對象擴展運算符和動態鍵的 oneliner。
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);
你需要用到的是underscore 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>
怎么樣:
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']);
鑒於這是 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];
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.