簡體   English   中英

使用下划線將兩個鍵和值數組合並到一個對象中

[英]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']);

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];

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM