30

1 つはキー、もう 1 つは値を持つ 2 つの配列があるとします。

keys = ['foo', 'bar', 'qux']
values = ['1', '2', '3']

underscore.js メソッドのみを使用して、どのようにオブジェクトに変換しますか?

{
   foo: '1', 
   bar: '2',
   qux: '3'
}

私はプレーンなJavaScriptの答えを探していません(このような)。

私は個人的な練習としてこれを求めています。アンダースコアにはまさにこれを行うメソッドがあると思っていましたが、そうではないことがわかり、それができるかどうか疑問に思いました。答えはありますが、かなりの数の操作が必要です。どのようにしますか?

4

8 に答える 8

48

Underscore.js ソリューションを求められたことは知っていますが、これには必要ありません。これは、ES7 オブジェクト スプレッド オペレータと動的キーを使用したワンライナーです。

keys.reduce((obj, k, i) => ({...obj, [k]: values[i] }), {})
于 2016-12-03T06:50:34.780 に答える
39

ES6 の使用:

let numbers = [1, 2, 3],
    names = ["John", "Mike", "Colin"];

let a = Object.assign({}, ...numbers.map((n, index) => ({[n]: names[index]})))

console.log(a);
于 2016-08-12T10:52:30.003 に答える
15

使用する必要があるのは、アンダースコア 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>

于 2013-01-18T13:30:27.647 に答える
14

どうですか:

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を参照してください

于 2012-08-30T14:59:12.513 に答える
4

最もきれいなのは

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.

于 2013-07-22T03:20:53.237 に答える
2

あなたが探しているのはzip機能です。

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];
于 2012-08-30T14:29:01.317 に答える