Tengo una variedad de objetos:
[
{ key : '11', value : '1100', $$hashKey : '00X' },
{ key : '22', value : '2200', $$hashKey : '018' }
];
¿Cómo lo convierto en lo siguiente mediante JavaScript?
{
"11": "1000",
"22": "2200"
}
Tengo una variedad de objetos:
[
{ key : '11', value : '1100', $$hashKey : '00X' },
{ key : '22', value : '2200', $$hashKey : '018' }
];
¿Cómo lo convierto en lo siguiente mediante JavaScript?
{
"11": "1000",
"22": "2200"
}
Respuestas:
Probablemente estés buscando algo como esto:
// 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 pequeña solución ES6 puede verse así:
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)
Además, si usa la extensión de objetos, puede verse así:
var object = arr.reduce((obj, item) => ({...obj, [item.key]: item.value}) ,{});
Una solución más que es 99% más rápida es (probada en jsperf):
var object = arr.reduce((obj, item) => (obj[item.key] = item.value, obj) ,{});
Aquí nos beneficiamos del operador de coma, evalúa todas las expresiones antes de la coma y devuelve una última (después de la última coma). Así que no copiamos objcada vez, más bien le asignamos una nueva propiedad.
var object = arr.reduce((obj, item) => (obj[item.key] = item.value, obj) ,{});
({...obj, ...{[item.key]: item.value}}) ,{});
Me gusta el enfoque funcional para lograr esta tarea:
var arr = [{ key:"11", value:"1100" }, { key:"22", value:"2200" }];
var result = arr.reduce(function(obj,item){
obj[item.key] = item.value;
return obj;
}, {});
Nota: El último {}es el objvalor inicial para la función de reducción, si no proporciona el valor inicial arr, se utilizará el primer elemento (lo que probablemente no sea deseable).
Tratando de corregir esta respuesta en ¿Cómo convierto una matriz de objetos en un objeto en JavaScript? ,
esto debería hacerlo:
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 }) )));
Usando 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);
Una forma limpia de hacer esto usando JavaScript moderno es la siguiente:
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" }
¡Usa lodash !
const obj = _.keyBy(arrayOfObjects, 'keyName')
Basado en las respuestas sugeridas por muchos autores, creé un escenario de prueba de JsPref. https://jsperf.com/array2object82364
A continuación se muestran las capturas de pantalla del rendimiento. Es un poco impactante para mí ver que el resultado de Chrome contrasta con Firefox y Edge, incluso después de ejecutarlo varias veces.
Usando 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'));
Actualización: el mundo siguió girando. En su lugar, utilice un enfoque funcional.
Aqui tienes:
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"}
arrayes una palabra clave reservada que la gente usa arren su lugar. etc.
A continuación, se explica cómo aceptar dinámicamente lo anterior como una cadena e interpolarlo en un objeto:
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)
Puede usar la función mapKeys lodash para eso. ¡Solo una línea de código!
Consulte este ejemplo de código completo (copie y pegue esto en repl.it o similar):
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;}, {})