2016-04-22 2 views
2

の配列から重複した値を削除します。Javascriptが、私は、オブジェクトの以下の配列が言及した結果に変換されなければならない要件をしたオブジェクト

list = [{name : 'John', id : '1'}, {name : 'John', id : '2'}, {name : 'John', id : '3'}, {name : 'John', id : '4'}]; 

結果

list = [{name : 'John', id : '1, 2, 3, 4'}]; 

にどのようにしてそれを行うことができますか?あなたはそれ元の配列を変異させずにtemopraryオブジェクトの助けを借りて、単一のループにグループ化することができ

+0

'id'を文字列または配列にしますか? '1,2,3,4' 'または' ['1'、 '2'、 '3'、 '4'] '? – cst1992

+0

'list.filter()' – evolutionxbox

+0

これは、カンマ区切りの文字列ですhttp://stackoverflow.com/questions/9229645/remove-duplicates-from-javascript-array – evolutionxbox

答えて

3
あなたは重複を除外するとでオリジナルを変更するために、一時的なオブジェクトと Array#filterを使用してそれを行うことができ

同じ時刻:

var list = [ 
 
     {name : 'John', id : '1'}, 
 
     {name : 'John', id : '2'}, 
 
     {name : 'John', id : '3'}, 
 
     {name : 'John', id : '4'} 
 
    ], 
 
    temp = {}; 
 

 
list = list.filter(function (o) { 
 
    if (temp.hasOwnProperty(o.name)) { 
 
     temp[o.name].id += ', ' + o.id; 
 
     return false; 
 
    } 
 
    else { 
 
     temp[o.name] = o; 
 
     return true; 
 
    } 
 
}); 
 

 
document.body.textContent = JSON.stringify(list);

+0

元のリストをどのように変更していますか? –

+0

さて、私はそれを手に入れました。あなたはoと一緒に働いています。ありがとう! –

+0

@PrateekAgarwal:ようこそ。あなたに最適な答えを受け入れることを忘れないでください:-)。 –

1

var list = [{ name: 'John', id: '1' }, { name: 'John', id: '2' }, { name: 'John', id: '3' }, { name: 'John', id: '4' }], 
 
    grouped = []; 
 

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

 
document.write('<pre>' + JSON.stringify(grouped, 0, 4) + '</pre>');

A少しコンパクトなバージョン

var list = [{ name: 'John', id: '1' }, { name: 'John', id: '2' }, { name: 'John', id: '3' }, { name: 'John', id: '4' }], 
 
    grouped = []; 
 

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

 
document.write('<pre>' + JSON.stringify(grouped, 0, 4) + '</pre>');

1

は、これは、より一般的な解決策

function consolidate(list){ 
    var names={}; 
    list.forEach(function(e){ 
     if (!names[e.name]) names[e.name]=[e.id]; 
     else names[e.name].push(e.id); 
    }); 
    var rtn=[]; 
    Object.keys(names).forEach(function(n){ 
     rtn.push({name:n, id:names[n].join(', ')}); 
    }); 
    return rtn; 
} 
基本的に

当時配列に再マッピングデータを蓄積するためにオブジェクトを使用するのではなく、あなたの特定の質問を解決することです。

+0

なぜ地図ですか?何かを返さない。 –

+0

良い点。これは実際には入力の際の私の怠惰ですが、あなたは正しいですし、forEachに変更しました –

関連する問題