2016-08-19 113 views
-2

要使用反應過來,我有一個對象數組是這樣的:的Javascript循環一個對象數組,並返回一個新的數組

{ 
    _id: 1, 
    items: [ 

       { goodName: "cake", amount: 10 }, 
       { goodName: "potato", amount: 11 }, 
       { goodName: "apple", amount: 15 } 
      ] 
    } 
    { 
    _id: 2, 
    items: [ 

       { goodName: "cake", amount: 10 }, 
       { goodName: "potato", amount: 11 }, 
       { goodName: "apple", amount: 15 } 
      ] 
    } 
    { 
    _id: 3, 
    items: [ 

       { goodName: "cake", amount: 10 }, 
       { goodName: "potato", amount: 11 }, 
       { goodName: "apple", amount: 15 } 
      ] 
    } 

現在,我想通過這個對象數組循環,並返回一個包含數組 每個good.I想要的量的累計值使用.map()方法,使這樣的:

var value = items.map(function(item) { 
       var amounts = 0; 
       var amount=[]; 
       for (var i=0; i<=myArr.length; i++) { 
        if (myArr[i] === item.name) { 
         amounts=amounts+item.amount; 
         amount.push(amounts); 
        } 
       } 
      }) 

但它不工作。 myArr是一個數組,我使用new Set()Array.from()方法遍歷goodName並返回它。我不知道我用什麼方法可以做到,每個人都有另一種方式嗎?

+0

您對項目使用'map',但您沒有從地圖回調函數返回任何東西。你應該從回調中返回一些東西。查看文檔:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map – kabirbaidhya

+0

它來自myArr?它包含什麼? –

+0

請添加想得到的結果。 –

回答

3

我已經編寫了代碼來循環您的信息並返回每個好類型總量的計數。但是,需要進行一些澄清。

  • 您問題中的信息需要用方括號包裹,因爲您顯示的外部對象需要是數組中的元素。
  • 我正在返回一個對象,而不是你在你的問題中建議的數組。這使得results包含有關項目各理貨對應,即{good1: total1, good2: total2, ...}
  • 我有一個額外的(第四)對象只是爲了顯示代碼既不需要相同數量的商品甚至也不是商品的相同身份在每個數組元素中。

var arr = [ 
 
    {_id: 1, items: [ 
 
    {goodName: "cake", amount: 10}, 
 
    {goodName: "potato", amount: 11}, 
 
    {goodName: "apple", amount: 15} 
 
    ]}, 
 
    {_id: 2, items: [ 
 
    {goodName: "cake", amount: 10}, 
 
    {goodName: "potato", amount: 11}, 
 
    {goodName: "apple", amount: 15} 
 
    ]}, 
 
    {_id: 3, items: [ 
 
    {goodName: "cake", amount: 10}, 
 
    {goodName: "potato", amount: 11}, 
 
    {goodName: "apple", amount: 15} 
 
    ]}, 
 
    {_id: 4, items: [ 
 
    {goodName: "potato", amount: 1000}, 
 
    {goodName: "peach", amount: 2000} 
 
    ]} 
 
]; 
 

 
var results = {}; 
 
arr.forEach(arrElmt => { 
 
    arrElmt.items.forEach(item => { 
 
    results[item.goodName] = (results[item.goodName] || 0) + item.amount; 
 
    }); 
 
}); 
 
var res = JSON.stringify(results); 
 

 
console.log(res);

+1

請在代碼段中使用console.log而不是document.write,這樣我可以在智能手機上看到消息。 +1 – gaetanoM

+0

@gaetanoM我使用'document.write'來提高速度,但現在我已經將它改爲'document.body.innerHTML = ...'和'console.log(...)'。我並不總是確定在什麼情況下(例如移動)可以看到什麼,所以希望這些中的一個或兩個都能起到幫助作用。 –

+0

對不起,我試着更新你的代碼片段,直到現在我明白了這個問題:在windows mobile 8.1上es 6不起作用(即:let,=>等等)。對不起,有這種可能性會很高興。請更新您的摘錄,以便我的名字消失。再次感謝您的耐心。 – gaetanoM

0

你不能只使用地圖,因爲你積累項的值。我會用降低:

const arr = [ 
 
     {_id: 1, items: [ 
 
     {goodName: "cake", amount: 10}, 
 
     {goodName: "potato", amount: 11}, 
 
     {goodName: "apple", amount: 15} 
 
     ]}, 
 
     {_id: 2, items: [ 
 
     {goodName: "cake", amount: 10}, 
 
     {goodName: "potato", amount: 11}, 
 
     {goodName: "apple", amount: 15} 
 
     ]}, 
 
     {_id: 3, items: [ 
 
     {goodName: "cake", amount: 10}, 
 
     {goodName: "potato", amount: 11}, 
 
     {goodName: "apple", amount: 15} 
 
     ]}, 
 
     {_id: 4, items: [ 
 
     {goodName: "potato", amount: 1000}, 
 
     {goodName: "peach", amount: 2000} 
 
     ]} 
 
    ]; 
 
    
 
    let results = [].concat.apply([], arr.map(elem => elem.items)) 
 
     .reduce((results, item) => { 
 
      results[item.goodName] = (results[item.goodName] || 0) + item.amount; 
 
      return results; 
 
     }, {}); 
 
    document.write(JSON.stringify(results));

JS沒有flatMap,所以[].concat.apply舞蹈是有點怪異,但任何好的庫將擁有它。

相關問題