web-dev-qa-db-fra.com

fusionner deux tableaux de clés et de valeurs dans un objet à l'aide d'un trait de soulignement

Étant donné deux tableaux, un avec des clés, un avec des valeurs:

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

Comment le convertiriez-vous en objet, en utilisant uniquement les méthodes underscore.js?

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

Je ne cherche pas une réponse javascript simple ( comme ça ).

Je demande cela comme un exercice personnel. Je pensais que le soulignement avait une méthode qui faisait exactement cela, seulement pour découvrir que ce n'était pas le cas, et cela m'a amené à me demander si cela pouvait être fait. J'ai une réponse, mais cela implique pas mal d'opérations. Comment feriez-vous?

25
Cristi Mihai

Ce que vous devez utiliser est la méthode _. Object de soulignement js. Si la méthode objet n'est pas présente dans votre version de underscore.js, vous devrez lui ajouter manuellement cette méthode.

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>
14
Vikram Deshmukh

Je sais que vous avez demandé des solutions Underscore.js, mais vous n'en avez pas besoin pour cela. Voici un oneliner utilisant l'opérateur de propagation d'objet ES7 et les clés dynamiques.

keys.reduce((obj, k, i) => ({...obj, [k]: values[i] }), {})
35
ghirlekar

Utilisation d'ES6:

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

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

console.log(a);
32
Tudor Morar

Que diriez-vous:

keys = ['foo', 'bar', 'qux'];
values = ['1', '2', '3'];
some = {};
_.each(keys,function(k,i){some[k] = values[i];});

Pour être complet: une autre approche pourrait être:

 _.Zip(['foo', 'bar', 'qux'],['1', '2', '3'])
  .map(function(v){this[v[0]]=v[1];}, some = {});

Pour mémoire, sans soulignement, vous pouvez étendre 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']);

Voir jsfiddle

14
KooiInc

Étant donné qu'il a 4 ans et que Lodash a plus ou moins pris la place d'Underscore, j'ai pensé partager cette solution en utilisant Lodash:

var keys = ['foo', 'bar', 'qux'];
var values = ['1', '2', '3'];
var obj = _.zipObject( keys, values );

Simple et propre.

10
Kevin Leary
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);
6
capipo

Le plus propre est

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

Ou utiliser _.reduce, mais si vous utilisez un trait de soulignement, vous avez déjà _.object.

4
user663031

Ce que vous cherchez, c'est la fonction Zip.

fonction Zip

Edit: il ne crée pas d'objet mais il combine le tableau en créant un sous-tableau

Aucune fonction ne fait exactement ce que vous voulez. Mais vous pouvez utiliser le résultat de Zip pour créer votre objet.

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];
2
Richard Heath