2016-05-10 2 views
-2

У меня есть массив объектов, как так:Массив: сделать свойство объекта в массив ключевых

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

, что я хочу для того чтобы достигнуть является создание второго массива с атрибутом имени в качестве ключа массива, так это выглядит следующим образом:

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

Есть ли простой и эффективный способ сделать это с помощью underscoreJS или простого JS?

+6

Вы не хотите _array_, вы хотите ** объект ** – Tushar

+0

Этот второй метод - это объект, а не массив. – ManoDestra

+0

'array.reduce', вероятно, сделает трюк. Что вы пробовали? Где ваш код? –

ответ

2

Думаю, это то, чего вы хотите.

Здесь ссылка 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)); 

Выход:

{ 
    name1:{ 
      attribute1: "a1Value1", 
      attribute2: "a2Value1" 
     }, 
    name2: { 
      attribute1: "a1Value2", 
      attribute2: "a2Value2" 
    } 
} 
1

Быстрый и грязный, если вы на самом деле не заботиться о name имущества в результате:

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

Если вы хотите name имущество, вывезенное , то вы можете delete от c. Однако это будет мутировать исходное значение. Если вы хотите, чтобы исходный массив по-прежнему имел свойство name в такти, вам нужно будет скопировать объект (но без свойства name).

Так что вы можете сделать:

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; 
},{}); 

Или:

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; 
},{}); 

Лично я был бы склонен просто оставить name имущество там, если нет действительно веских причин (то есть на самом деле вызывает проблема с производительностью или какой-либо другой код будет жаловаться, если он существует), чтобы решить все проблемы с его удалением.

1

Вот один из способов сделать это ...

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

Или, короче ...

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

вы можете скопировать свойства над вручную или сделать копию клонированного из оригинальный объект, но я не сделал этого здесь исключительно для упрощения моего примера.

Смежные вопросы