2016-11-11 67 views
-1

我被卡住了!我有以下代碼:困惑,循環嵌套對象並做具體計算

const hours = [ 
    { 
     "workHour" : "8", 
     "Item name 1" : 120, 
     "Item name 2" : 149, 
     "Item name 3" : 137 
    }, 
    { 
     "workHour" : "9", 
     "Item name 1" : 134, 
     "Item name 2" : 119, 
     "Item name 3" : 144 
    }, 
    { 
     "workHour" : "10", 
     "Item name 1" : 60, 
     "Item name 2" : 86, 
     "Item name 3" : 83 
    }, 
]; 

const records = [ 
    { date: new Date(), statistics: hours }, 
    { date: new Date(), statistics: hours }, 
    { date: new Date(), statistics: hours }, 
]; 

const result = {}; 
result.chart = []; 

records.forEach((record) => { 
    const items = []; 
    record.statistics.forEach((hour) => { 
     for (let key in hour) { 
     if (key !== 'workHour') { 
      items.push({ 
       key: hour[key] 
      }) 
     } 
     } 
    }); 
    result.chart.push({ 
     date: record.date, 
     items 
    }); 
}); 

console.log(result); 

我試圖做的是遍歷所有的記錄數組中的每個項目,然後遍歷每個記錄的時間,加在一起每一個項目的所有值,如計算從所有的總小時,我試着得到的結果是:

array = [ 
    { 
    date: //record date, 
    "Item name 1" : 314, 
    "Item name 2" : 354, 
    "Item name 3" : 364 
    }, 
    { 
    date: //record date, 
    "Item name 1" : 314, 
    "Item name 2" : 354, 
    "Item name 3" : 364 
    }, 
    { 
    date: //record date, 
    "Item name 1" : 314, 
    "Item name 2" : 354, 
    "Item name 3" : 364 
    } 
]; 

當小時項鍵可正常工作的例子:

const hours = [ 
{ 
    "workHour" : "8", 
    "Item name 1" : 120, 
    "Item name 2" : 149, 
    "Item name 3" : 137 
}, 
{ 
    "workHour" : "9", 
    "Item name 1" : 134, 
    "Item name 2" : 119, 
    "Item name 3" : 144 
}, 
{ 
    "workHour" : "10", 
    "Item name 1" : 60, 
    "Item name 2" : 86, 
    "Item name 3" : 83 
}, 

]。

const records = [ 
    { date: new Date(), statistics: hours }, 
    { date: new Date(), statistics: hours }, 
    { date: new Date(), statistics: hours }, 
]; 

const result = {}; 
result.records = []; 

const calculate = (profits, key) => 
    profits 
    .filter(profit => profit !== null) 
    .reduce((prevVal, profitVal) => prevVal + profitVal[key], 0) || 0; 

records.forEach((record) => { 
    const items = []; 
    const { statistics } = record; 
    result.records.push({ 
     date: record.date, 
     'Item name 1': calculate(statistics, 'Item name 1'), 
     'Item name 2': calculate(statistics, 'Item name 2'), 
     'Item name 3': calculate(statistics, 'Item name 3'), 
    }); 
}); 

console.log(result); 

打印:

records = [ 


{ 
     'Item name 1': 314, 
     'Item name 2': 354, 
     'Item name 3': 364, 
    }, 
    { 
     'Item name 1': 314, 
     'Item name 2': 354, 
     'Item name 3': 364, 
    }, 
    { 
     'Item name 1': 314, 
     'Item name 2': 354, 
     'Item name 3': 364, 
    }, 
] 
+1

您正在嘗試在'array'每個對象設置相同的值? – guest271314

+0

@ guest271314我想循環所有的時間,並且+ =總結每個項目 –

+0

沒有關注。預期的結果數組包含相同的對象? – guest271314

回答

2

我相信這解決了你的要求,但我覺得還有更多的東西。是記錄所有打算有相同的小時

我知道它有點密集,所以我已經添加了一些評論,希望對此有所瞭解。

const hours = [ 
 
    { "workHour" : "8", "Item name 1" : 120, "Item name 2" : 149, "Item name 3" : 137 }, 
 
    { "workHour" : "9", "Item name 1" : 134, "Item name 2" : 119, "Item name 3" : 144 }, 
 
    { "workHour" : "10", "Item name 1" : 60, "Item name 2" : 86, "Item name 3" : 83 } 
 
]; 
 

 
const records = [ 
 
    { date: new Date(), statistics: hours }, 
 
    { date: new Date(), statistics: hours }, 
 
    { date: new Date(), statistics: hours } 
 
]; 
 

 
// ======================== 
 
// Using map() 
 
// For each "record" return an object based on "record" 
 
// ======================== 
 
var result = records.map(function(record){ 
 

 
    // ======================== 
 
    // Create the initial result that does not depend 
 
    // on summing up the "statistics". 
 
    // 
 
    // We will pass this into the reduce() and it will be the 
 
    // initial value of the accumulator 
 
    // ======================== 
 
    var initialResult = {date: record.date}; 
 
    // ======================== 
 
    
 
    // ======================== 
 
    // Using reduce() 
 
    // itterate over the interesting work items 
 
    // summing up the hours 
 
    // ======================== 
 
    var finalResult = record.statistics.reduce(function(acc, item){ 
 

 
    Object.keys(item) // an array of keys in our item object 
 
      .filter(function(key){ return key !== "workHour"; }) // remove this key 
 
      .forEach(function(key) { acc[key] = (acc[key] || 0) + item[key] }); // for each remaining key, add its value to running total 
 

 
    // ======================== 
 
    // return the running total accumulator for use against the next item 
 
    // ======================== 
 
    return acc; 
 
    // ======================== 
 

 
    }, initialResult); 
 
    // ======================== 
 

 
    // ======================== 
 
    // return an object based on record but with accumulated data from the reduce() 
 
    // this object becomes an item in the array ultimately returned by map() 
 
    // ======================== 
 
    return finalResult; 
 
    // ======================== 
 

 
}); 
 
// ======================== 
 

 
console.log(result)

這裏是沒有減少的一個版本:

const hours = [ 
 
    { "workHour" : "8", "Item name 1" : 120, "Item name 2" : 149, "Item name 3" : 137 }, 
 
    { "workHour" : "9", "Item name 1" : 134, "Item name 2" : 119, "Item name 3" : 144 }, 
 
    { "workHour" : "10", "Item name 1" : 60, "Item name 2" : 86, "Item name 3" : 83 } 
 
]; 
 

 
const records = [ 
 
    { date: new Date(), statistics: hours }, 
 
    { date: new Date(), statistics: hours }, 
 
    { date: new Date(), statistics: hours } 
 
]; 
 

 
var result = records.map(function(record){ 
 
    var initialResult = {date: record.date}; 
 

 
    record.statistics.forEach(function(item){ 
 
    Object.keys(item) 
 
      .filter(function(key){ return key !== "workHour"; }) 
 
      .forEach(function(key) { initialResult[key] = (initialResult[key] || 0) + item[key] }); 
 
    }); 
 

 
    return initialResult; 
 
}); 
 

 
console.log(result)

+0

@JasonBrill我注意到一個不同的答案,你表示我的方法有點混亂。我添加了一些評論,希望更清楚一點。 – JonSG

+0

非常感謝!爲解釋只是想知道有沒有辦法實現這一點,而不減少? –

+0

我添加了一個不使用reduce的版本() – JonSG

1

如果正確地解釋問題,您也可以替換for..of迴路.forEach(),使用計算屬性名[key]設置屬性名的對象推到items陣列

const hours = [{ 
 
    "workHour": "8", 
 
    "Item name 1": 120, 
 
    "Item name 2": 149, 
 
    "Item name 3": 137 
 
}, { 
 
    "workHour": "9", 
 
    "Item name 1": 134, 
 
    "Item name 2": 119, 
 
    "Item name 3": 144 
 
}, { 
 
    "workHour": "10", 
 
    "Item name 1": 60, 
 
    "Item name 2": 86, 
 
    "Item name 3": 83 
 
}, ]; 
 

 
const records = hours.map((hour, index) => ({ 
 
    date: new Date(), 
 
    statistics: hours[index] 
 
    })); 
 

 
const result = {}; 
 
result.chart = []; 
 

 
records.forEach((record, index) => { 
 
    const items = []; 
 
    for (let {statistics:hour} of [record]) { 
 
    for (let key in hour) { 
 
    if (key !== 'workHour') { 
 
     items.push({ 
 
      [key]: hour[key] 
 
       + (result.chart[index -1] 
 
         && result.chart[index -1].hasOwnProperty("items") 
 
        ? result.chart[index-1].items 
 
         .filter(obj => obj.hasOwnProperty(key))[0][key] 
 
        : 0)   
 
     }) 
 
     } 
 
    } 
 
    }; 
 
    result.chart.push({ 
 
    date: record.date, 
 
    items 
 
    }); 
 
}); 
 

 
console.log(result);

+0

感謝您幫助我! JonSG得到了我後來的結果,但我完全不明白他的方法..有沒有簡化的方法呢? –

+0

Stacksnippets中的'javascript'不會返回預期結果嗎? https://jsfiddle.net/u950qf04/1/? – guest271314

+0

差不多,你的物品數組保存附加的[] []兩個數組而不是直接的物品 - >物品1,物品2,物品3,就像@JonSG做的 –