2016-05-10 10 views
-2

Ich habe ein Array von Objekten wie so:Array: Objekt-Eigenschaft in einem Array macht Schlüssel

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

was ich achive will, ist zweiten Array mit Namensattribut als Arrayschlüssel zu erstellen, so dass es wie folgt aussieht:

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

Gibt es eine einfache und effiziente Möglichkeit, dies mit Unterstreichung oder Plain JS zu tun?

+6

Sie wollen nicht _array_, Sie wollen ** Objekt ** – Tushar

+0

Diese zweite Methode ist ein Objekt, kein Array. – ManoDestra

+0

'array.reduce' würde wahrscheinlich den Trick machen. Was hast du probiert? Wo ist dein Code? –

Antwort

2

Ich denke, das ist was du willst.

Hier ist Jsbin Link.

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

Ausgang:

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

Schnell und schmutzig, wenn Sie über die name Eigenschaft im Ergebnis nicht wirklich tun:

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

Wenn Sie die name Eigenschaft entfernt wollen Dann kannst du delete es von c. Dies würde jedoch den ursprünglichen Wert verändern. Wenn das ursprüngliche Array weiterhin mit der Eigenschaft name intakt sein soll, müssen Sie stattdessen das Objekt kopieren (jedoch ohne die Eigenschaft name).

So könnten Sie tun:

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

Oder:

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

Ich persönlich würde es die name Eigenschaft nur zu verlassen geneigt sein, es sei denn, ein wirklich zwingenden Grund gibt es (dh es tatsächlich bewirkt, dass ein Performance-Problem oder ein anderes Stück Code wird sich beschweren, wenn es existiert), um alle Schwierigkeiten zu gehen, es zu löschen. Hier

1

ist eine Möglichkeit, es zu tun ...

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

Oder kürzer ...

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

Sie möchten, können die Eigenschaften über manuell oder führen Sie eine geklonte Kopie des kopieren ursprüngliches Objekt, aber ich habe das hier nicht getan, um mein Beispiel zu vereinfachen.

Verwandte Themen