Tengo una serie de objetos así:

arr[0] = {name: 'name1', attribute1: 'a1Value1', attribute2: 'a2Value1'} 
arr[1] = {name: 'name2', attribute1: 'a1Value2', attribute2: 'a2Value2'}

Lo que quiero lograr es crear una segunda matriz con el atributo de nombre como clave de matriz para que se vea así:

   arr2[name1] = {attribute1: 'a1Value1', attribute2: 'a2Value1'}
   arr2[name2] = {attribute1: 'a1Value2', attribute2: 'a2Value2'}

¿Hay una manera fácil y eficiente de hacerlo con subrayado JS o JS simple?

-3
sniegoman 10 may. 2016 a las 18:06

3 respuestas

La mejor respuesta

Creo que esto es lo que quieres.

Aquí está el enlace jsbin. http://jsbin.com/soheni/edit?html,js,console,output

var arry = [{name: 'name1', attribute1: 'a1Value1', attribute2: 'a2Value1'}, {name: 'name2', attribute1: 'a1Value2', attribute2: 'a2Value2'}];

function convert(arry){
  var data = {};
  arry.forEach(function(obj){
    var nameKey = obj.name;
    delete obj.name;
    data[nameKey] = obj;
  });
  return data;
}

console.log(convert(arry));

Salida:

{
   name1:{
           attribute1: "a1Value1",
           attribute2: "a2Value1"
         },
   name2: {
           attribute1: "a1Value2",
           attribute2: "a2Value2"
   }
}
1
Zohaib Ijaz 10 may. 2016 a las 15:22

Rápido y sucio si realmente no te importa la propiedad name en el resultado:

var obj = arr.reduce(function(p,c) {
    p[c.name] = c;
    return p;
},{});

Si desea eliminar la propiedad name, puede delete desde c. Sin embargo, esto estaría mutando el valor original. Si desea que la matriz original todavía tenga la propiedad name intacta, deberá copiar el objeto en su lugar (pero sin la propiedad name).

Entonces podrías hacer:

var obj = arr.reduce(function(p,c) {
    p[c.name] = c;
    delete c.name;   // note this removes it from the original array too!
    return p;
},{});

O:

var obj = arr.reduce(function(p,c) {
    var cheapCopy = JSON.parse(JSON.stringify(c));   // note this is not necessarily the most
                                                     // efficient way to clone an object
    delete cheapCopy.name;
    p[c.name] = cheapCopy;
    return p;
},{});

Personalmente, me inclinaría a dejar allí la propiedad name a menos que exista una razón realmente convincente (es decir, que realmente cause un problema de rendimiento o algún otro código se quejará si existe) para ir a todos los problemas de eliminándolo

1
Matt Burland 10 may. 2016 a las 15:25

Aquí hay una forma de hacerlo ...

var arr = [];
arr.length = 3;
arr[0] = { name: 'name1', attribute1: 'a1Value1', attribute2: 'a2Value1' };
arr[1] = { name: 'name2', attribute1: 'a1Value2', attribute2: 'a2Value2' };
arr[2] = { name: 'name3', attribute1: 'a1Value3', attribute2: 'a2Value3' };

var newObj = {};
for (var i = 0; i < arr.length; i++) {
    var arrObj = arr[i];
    var propName = arrObj.name;
    delete arrObj.name;
    newObj[propName] = arrObj;
}

console.log('New Object:', newObj);
for (var key in newObj) {
    console.log('New Object By Key/Value:', key, newObj[key]);
}

O, más corto ...

var newObj = {};
arr.forEach(function(obj) {
    var propName = obj.name;
    delete obj.name;
    newObj[propName] = obj;
});
console.log('newObj:', newObj);

Es posible que desee copiar las propiedades manualmente o hacer una copia clonada del objeto original, pero no lo he hecho aquí simplemente para simplificar mi ejemplo.

1
ManoDestra 10 may. 2016 a las 16:23