J'ai un tableau d'objets:
[
{ key : '11', value : '1100', $$hashKey : '00X' },
{ key : '22', value : '2200', $$hashKey : '018' }
];
Comment puis-je le convertir en JavaScript?
{
"11": "1000",
"22": "2200"
}
J'ai un tableau d'objets:
[
{ key : '11', value : '1100', $$hashKey : '00X' },
{ key : '22', value : '2200', $$hashKey : '018' }
];
Comment puis-je le convertir en JavaScript?
{
"11": "1000",
"22": "2200"
}
Réponses:
Vous recherchez probablement quelque chose comme ceci:
// original
var arr = [
{key : '11', value : '1100', $$hashKey : '00X' },
{key : '22', value : '2200', $$hashKey : '018' }
];
//convert
var result = {};
for (var i = 0; i < arr.length; i++) {
result[arr[i].key] = arr[i].value;
}
console.log(result);
La petite solution ES6 peut ressembler à:
var arr = [{key:"11", value:"1100"},{key:"22", value:"2200"}];
var object = arr.reduce(
(obj, item) => Object.assign(obj, { [item.key]: item.value }), {});
console.log(object)
De plus, si vous utilisez la propagation d'objets, cela peut ressembler à:
var object = arr.reduce((obj, item) => ({...obj, [item.key]: item.value}) ,{});
Une autre solution qui est 99% plus rapide est (testé sur jsperf):
var object = arr.reduce((obj, item) => (obj[item.key] = item.value, obj) ,{});
Ici, nous bénéficions de l'opérateur virgule, il évalue toutes les expressions avant la virgule et renvoie une dernière (après la dernière virgule). Nous ne copions donc pas à objchaque fois, nous lui attribuons plutôt une nouvelle propriété.
var object = arr.reduce((obj, item) => (obj[item.key] = item.value, obj) ,{});
({...obj, ...{[item.key]: item.value}}) ,{});
J'aime l'approche fonctionnelle pour réaliser cette tâche:
var arr = [{ key:"11", value:"1100" }, { key:"22", value:"2200" }];
var result = arr.reduce(function(obj,item){
obj[item.key] = item.value;
return obj;
}, {});
Remarque: Last {}est la objvaleur initiale de la fonction de réduction, si vous ne fournissez pas la valeur initiale, le premier arrélément sera utilisé (ce qui n'est probablement pas souhaitable).
Essayer de résoudre cette réponse dans Comment convertir un tableau d'objets en un seul objet en JavaScript? ,
cela devrait le faire:
var array = [
{key:'k1',value:'v1'},
{key:'k2',value:'v2'},
{key:'k3',value:'v3'}
];
var mapped = array .map(item => ({ [item.key]: item.value }) );
var newObj = Object.assign({}, ...mapped );
console.log(newObj );
var newObj = Object.assign({}, ...(array.map(item => ({ [item.key]: item.value }) )));
Utilisation d' Object.fromEntries :
const array = [
{ key: "key1", value: "value1" },
{ key: "key2", value: "value2" },
];
const obj = Object.fromEntries(array.map(item => [item.key, item.value]));
console.log(obj);
Une façon simple de le faire en utilisant JavaScript moderne est la suivante:
const array = [
{ name: "something", value: "something" },
{ name: "somethingElse", value: "something else" },
];
const newObject = Object.assign({}, ...array.map(item => ({ [item.name]: item.value })));
// >> { something: "something", somethingElse: "something else" }
Utilisez lodash !
const obj = _.keyBy(arrayOfObjects, 'keyName')
Sur la base des réponses suggérées par de nombreux auteurs, j'ai créé un scénario de test JsPref. https://jsperf.com/array2object82364
Voici les captures d'écran des performances. C'est un peu choquant pour moi de voir, le résultat du chrome est en contraste avec Firefox et Edge, même après l'avoir exécuté plusieurs fois.
Utilisation de Underscore.js :
var myArray = [
Object { key="11", value="1100", $$hashKey="00X"},
Object { key="22", value="2200", $$hashKey="018"}
];
var myObj = _.object(_.pluck(myArray, 'key'), _.pluck(myArray, 'value'));
Mise à jour: le monde ne cessait de tourner. Utilisez plutôt une approche fonctionnelle.
Voici:
var arr = [{ key: "11", value: "1100" }, { key: "22", value: "2200" }];
var result = {};
for (var i=0, len=arr.length; i < len; i++) {
result[arr[i].key] = arr[i].value;
}
console.log(result); // {11: "1000", 22: "2200"}
arrayest un mot-clé réservé que les gens utilisent à la arrplace. etc.
Voici comment accepter dynamiquement ce qui précède en tant que chaîne et l'interpoler dans un objet:
var stringObject = '[Object { key="11", value="1100", $$hashKey="00X"}, Object { key="22", value="2200", $$hashKey="018"}]';
function interpolateStringObject(stringObject) {
var jsObj = {};
var processedObj = stringObject.split("[Object { ");
processedObj = processedObj[1].split("},");
$.each(processedObj, function (i, v) {
jsObj[v.split("key=")[1].split(",")[0]] = v.split("value=")[1].split(",")[0].replace(/\"/g,'');
});
return jsObj
}
var t = interpolateStringObject(stringObject); //t is the object you want
// original
var arr = [{
key: '11',
value: '1100',
$$hashKey: '00X'
},
{
key: '22',
value: '2200',
$$hashKey: '018'
}
];
// My solution
var obj = {};
for (let i = 0; i < arr.length; i++) {
obj[arr[i].key] = arr[i].value;
}
console.log(obj)
Vous pouvez utiliser la fonction lodash mapKeys pour cela. Juste une ligne de code!
Veuillez vous référer à cet exemple de code complet (copier-coller ceci dans repl.it ou similaire):
import _ from 'lodash';
// or commonjs:
// const _ = require('lodash');
let a = [{ id: 23, title: 'meat' }, { id: 45, title: 'fish' }, { id: 71, title: 'fruit' }]
let b = _.mapKeys(a, 'id');
console.log(b);
// b:
// { '23': { id: 23, title: 'meat' },
// '45': { id: 45, title: 'fish' },
// '71': { id: 71, title: 'fruit' } }
var obj = [
{id: 1 , name : 'gaju' , class : 'kv'},
{id: 2 , name : 'tushar' , class : 'Super'}
];
function conv(obj,arg){
var temp= {};
var output= {}
for(key in obj){
temp[key] = obj[key];
};
var i=0;
for(key in temp){
var aa = {};
var value = temp[key][arg];
aa[value] = temp[i];
//console.log(aa[value][arg] );
output[aa[value][arg]]= aa[value];
i++;
}
console.log(output);
}
calling function
conv(obj,'class');
[{key:"11", value:"1100"}, {key:"22", value:"2200"}].reduce(function(m,v){m[v.key] = v.value; return m;}, {})