2017-12-29 19 views
1

すべてのオブジェクトを重複した '名前'プロパティでマージしようとしていますが、マージによって、それらの '値'プロパティを一緒に追加して重複するオブジェクトを削除します。同じ1つのプロパティ名を持つオブジェクトの配列を結合する

array = [ 
 
     { name: 'f', value: '10' }, 
 
     { name: '5', value: '10' }, 
 
     { name: 'f', value: '10' }, 
 
     { name: '5', value: '10' }, 
 
     { name: 'f', value: '10' }, 
 
     { name: '5', value: '10' }, 
 
    ] 
 

 
    for (let i = 0; i < array.length; i++) { 
 
     for (let y = 0; y < array.length; y++) { 
 

 
      if (array[y].name == array[i].name) { 
 

 
       array[i].value = parseInt(array[i].value) + parseInt(array[y].value) 
 

 
       array.splice(y,1) 
 
       
 
      } 
 
     } 
 
    } 
 
    
 
    console.log(array) 
 
    // gives result [ { name: '5', value: 30 }, { name: 'f', value: '10' } ] 
 
    // expected results [ { name: '5', value: 30 }, { name: 'f', value: '30' } ]

+0

は重要な最終配列の順序ですか? – Phil

答えて

3

これを行うにはreducemapの組み合わせを使用します。

let array = [ 
 
     { name: 'f', value: '10' }, 
 
     { name: '5', value: '10' }, 
 
     { name: 'f', value: '10' }, 
 
     { name: '5', value: '10' }, 
 
     { name: 'f', value: '10' }, 
 
     { name: '5', value: '10' }, 
 
    ]; 
 
    
 
    let resultObj = array.reduce((result, item) => { 
 
     result[item.name] = (result[item.name] || 0) + (Number(item.value) || 0); 
 
     return result; 
 
    }, {}); 
 
    
 
    let resultArray = Object.getOwnPropertyNames(resultObj).map(name => { 
 
     return {name, value: resultObj[name]} 
 
    }) 
 
    
 
    console.log(resultArray)

+0

リンクが期限切れになるので、スタックスニペットにする必要があります – vibhor1997a

+0

ありがとう、ちょうどでした。私の最初のスニペットxD –

1

Array.prototype.reduceArray.prototype.mapのための仕事のように見える:私のコードは、予想される結果が得られていないいくつかの理由

最初に行うべきことは、累積値の名前のMapを生成することです。

次に、名前と合計を持つオブジェクトの配列に変換できます。

const array = [ 
 
    { name: 'f', value: '10' }, 
 
    { name: '5', value: '10' }, 
 
    { name: 'f', value: '10' }, 
 
    { name: '5', value: '10' }, 
 
    { name: 'f', value: '10' }, 
 
    { name: '5', value: '10' } 
 
] 
 

 
const totals = array.reduce((map, item) => map.set(
 
    item.name, parseInt(item.value) + (map.get(item.name) || 0) 
 
), new Map()) 
 

 
const merged = Array.from(totals) 
 
    .map(([name, value]) => ({ name, value })) 
 

 
console.info('Merged', merged)


注:Map繰り返し "F" が "5" に続く、第一になるようオーダーです。注文を変更する必要がある場合は、Array.prototype.sortを使用する必要があります。

0

ここでの問題は、あなたがインデックス削除するときに、原因これに同じ配列を反復して更新しているということです配列のインデックスがシフトし、あなたは要素のいくつかを欠場します。あなたはiの要素を更新し、yで1を取り外すときyiが異なっていることを保証していないので、これが起こっている

array = [ 
    { name: 'f', value: '10' }, 
    { name: '5', value: '10' }, 
    { name: 'f', value: '10' }, 
    { name: '5', value: '10' }, 
    { name: 'f', value: '10' }, 
    { name: '5', value: '10' }, 

] 
newArray = []; 
for (let i = 0; i < array.length; i++) { 
    var found=false; 
    for(let j= 0;j<newArray.length;j++) { 
     if(newArray[j].name == array[i].name) { 
      newArray[j].value = parseInt(array[i].value)+ parseInt(newArray[j].value); 
      found = true; 
      break; 
     } 
    } 
    if(!found) { 
    newArray.push(array[i]); 
    } 
} 

console.log(newArray); 
0

:以下のコードを試してみてください。アイテムを変更してすぐに削除する状況があります。

あり、これを行うためのより良い方法がありますが、ここであなたが既に持っているものを修正するための簡単な方法です:

let array = [ 
 
    { name: 'f', value: '10' }, 
 
    { name: '5', value: '10' }, 
 
    { name: 'f', value: '10' }, 
 
    { name: '5', value: '10' }, 
 
    { name: 'f', value: '10' }, 
 
    { name: '5', value: '10' }, 
 
] 
 

 
for (let i = 0; i < array.length; i++) { 
 
    for (let y = 0; y < array.length; y++) { 
 
     // v-- ensure y and i are not the same 
 
     if (y !== i && array[y].name === array[i].name) { 
 
      array[i].value = parseInt(array[i].value) + parseInt(array[y].value) 
 
      array.splice(y,1) 
 
     } 
 
    } 
 
} 
 
    
 
console.log(array)

関連する問題