É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?
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>
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] }), {})
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);
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
É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.
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);
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
.
Ce que vous cherchez, c'est la 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];