2016-05-10 9 views
-2

にオブジェクトのプロパティを作り、私はそうのようなオブジェクトの配列を持っている:私はachiveたいもの配列:配列のキー

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

が、それは次のようになりますので、配列のキーとしてname属性を持つ二番目の配列を作成することです。

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

アンダースコアまたはプレーンJSで簡単かつ効率的に行う方法はありますか?

+6

_array_は不要です**オブジェクト** – Tushar

+0

この2番目のメソッドはオブジェクトであり、配列ではありません。 – 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からそれをすることができます。しかし、これは元の値を変更することになります。元の配列にtactの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); 

です私の例を単純化するために純粋にこれを行ったわけではありません。

関連する問題