簡體   English   中英

如何在 JavaScript 對象循環內遞歸聚合值?

[英]How do I recursively aggregate values inside of a loop of JavaScript objects?

我在嘗試創建一個 JavaScript 函數時遇到了困難,該函數通過循環遍歷對象的每個對象鍵的值來轉換對象,並且僅當對象鍵(這是一個時間戳)當前為或大於時才將它們相加前面的鍵。

為了直觀地解釋這一點,我試圖通過將前一天的每個值聚合到最近一天來將下圖(看起來不太吸引人)看起來更靠右。

在此處輸入圖片說明


試圖轉動這個當前對象

var orderedTimeSeriesObject = {
    1573538400: { // Tue, 12 Nov 2019 06:00:00
        clicks: 14,
        signups: 20
    },
    1574316000: { // Thu, 21 Nov 2019 06:00:00
        clicks: 13,
        signups: 15
    },
    1574488800: { // Sat, 23 Nov 2019 06:00:00
        clicks: 0,
        signups: 0
    }
};

進入這個(目標):

var orderedTimeSeriesObject = {
    1573538400: { // Tue, 12 Nov 2019 06:00:00
        clicks: 14,
        signups: 20
    },
    1574316000: { // Thu, 21 Nov 2019 06:00:00
        clicks: 27,
        signups: 35
    },
    1574488800: { // Sat, 23 Nov 2019 06:00:00
        clicks: 27,
        signups: 35
    }
};

這是我當前的代碼:

var newOrderedTimeSeriesObject = {};

Object.keys(orderedTimeSeriesObject).forEach((timestamp) => { 
    newOrderedTimeSeriesObject[timestamp] = {};
    Object.keys(orderedTimeSeriesObject).forEach((timestampToCompare) => { 
        if (timestamp >= timestampToCompare) {
            Object.values(timestamp).forEach((metric) => { 
                const metricAggregated = metric + timestampToCompare[metric];
                newOrderedTimeSeriesObject[timestamp][metric] = metricAggregated;
            });
        }
    });
});

console.log(newOrderedTimeSeriesObject);

幾個小時以來,我一直在思考這個問題,並在嵌套循環中迷失了方向,並且在嘗試遞歸時迷失了更多自己。 有什么我在這里俯瞰 - 這甚至可能嗎? 任何指導或幫助將不勝感激。

更新:

感謝 RK 的回答,這就是我最終的結果:

let lastKey = 0;
let lastValue = null;
for (key in orderedTimeSeriesObject)
{
    if (lastKey < key && lastValue != null)
    {
        Object.keys(orderedTimeSeriesObject[key]).forEach((metric) =>
        {
            orderedTimeSeriesObject[key][metric] += lastValue[metric];
        });
    }
    lastKey = key;
    lastValue = orderedTimeSeriesObject[key];
}

console.log(orderedTimeSeriesObject);

像這樣用for..in循環試試

 var orderedTimeSeriesObject = { 1573538400: { // Tue, 12 Nov 2019 06:00:00 clicks: 14, signups: 20 }, 1574316000: { // Thu, 21 Nov 2019 06:00:00 clicks: 13, signups: 15 }, 1574488800: { // Sat, 23 Nov 2019 06:00:00 clicks: 0, signups: 0 } }; var lastKey =0; var lastValue ={clicks:0,signups:0}; for (key in orderedTimeSeriesObject){ if(lastKey<key){ orderedTimeSeriesObject[key].clicks+= lastValue.clicks; orderedTimeSeriesObject[key].signups+= lastValue.signups; lastValue = orderedTimeSeriesObject[key]; } lastKey = key; } console.log(orderedTimeSeriesObject);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM