2016-08-25 15 views
1

同じIDを持つ複数のオブジェクトをまとめることで、きれいなJSONオブジェクトを作成しようとしています。 私が試したことは次のとおりです。 1.最初のオブジェクトのIDを後続のIDと一致するように保存します。 2.配列全体を繰り返し、類似のIDをチェックします。一致した場合は、名前を別の配列にオブジェクトとしてプッシュします。 3.空の名前。Club JSON JavaScriptのユニークキーのオブジェクト

オブジェクトが配列の最後の要素であるかどうかを確認するための条件が多数ありました。私はこれを達成するための最適な方法を探しています。問題の特定の性質を考慮して、私はまったく同じ問題をSOで見つけることができませんでした。多少のように、私はクラブと同様のIDを持つオブジェクトを一緒にしたいと思います

[ 
{ 
    id: 1, 
    name: 'John' 
}, 
{ 
    id: 1, 
    name: 'Jack' 
}, 
{ 
    id: 2, 
    name: 'Drake' 
}, 
{ 
    id: 2, 
    name: 'Joey' 
}, 
{ 
    id: 3, 
    name: 'Justin' 
}, 
{ 
    id: 3, 
    name: 'Rob' 
} 
] 

は、私のようなJSONオブジェクトを持っている

[{ 
    id: 1, 
    names: [{ 
     name: 'John' 
    }, 
    { 
     name: 'Jack' 
    }] 
}, 
{ 
    id: 2, 
    names: [{ 
     name: 'Drake' 
    }, 
    { 
     name: 'Joey' 
    }] 
}, 
{ 
    id: 3, 
    names: [{ 
     name: 'Justin' 
    }, 
    { 
     name: 'Rob' 
    }] 
}] 

答えて

2

あなたはArray#forEachとのオブジェクトを使用することができますハッシュインデックス基準オブジェクトと

var data = [{ id: 1, name: 'John' }, { id: 1, name: 'Jack' }, { id: 2, name: 'Drake' }, { id: 2, name: 'Joey' }, { id: 3, name: 'Justin' }, { id: 3, name: 'Rob' }], 
 
    grouped = []; 
 

 
data.forEach(function (a) { 
 
    if (!this[a.id]) { 
 
     this[a.id] = { id: a.id, names: [] }; 
 
     grouped.push(this[a.id]); 
 
    } 
 
    this[a.id].names.push({ name: a.name }); 
 
}, Object.create(null)); 
 

 
console.log(grouped);

+3

インデックス – Phil

+0

おかげニーナを格納するために 'forEach'呼び出しのために' this'引数を使用して、本当に滑らかなのです。つまり、それは参考になりました。 ただ1つの質問ですが、ここでヌルオブジェクトは正確に何をしていますか? –

+2

'Object.create(null)'の部分は、 'toString'のようなプロトタイプなしで、本当に空のオブジェクトを作成します。このオブジェクトは、 'id'への参照のためにコールバック広告ハッシュテーブルの中で' this'オブジェクトとして使用されます。 –

1

使用Array#reduce方法。

var data = [{ id: 1, name: 'John'}, { id: 1, name: 'Jack'}, { id: 2, name: 'Drake'}, { id: 2, name: 'Joey'}, { id: 3, name: 'Justin'}, { id: 3, name: 'Rob'}]; 
 

 
// object for index reference 
 
var ind = {}; 
 

 
// iteraate over array 
 
var res = data.reduce(function(arr, obj) { 
 
    // check index defined already 
 
    if (ind.hasOwnProperty(obj.id)) { 
 
    // if defined then push the name value 
 
    arr[ind[obj.id]].names.push({name: obj.name}); 
 
    } else { 
 
    // else push a new object in prefered format 
 
    arr.push({ id: obj.id, names: [{ name: obj.name }] }); 
 
    // define the index in reference object 
 
    ind[obj.id] = arr.length - 1; 
 
    } 
 
    // return the updated array 
 
    return arr; 
 
    // set initial value as epty array 
 
}, []); 
 

 
console.log(res);

関連する問題