我正在尝试计算两个数组随时间累积值的总和,看起来很简单,但是以下情况会使它变得复杂:其中一个数组可能缺少日期。
当一个数组有某个日期的值而另一个数组没有时,我们将这一存在于一个数组中的值和另一个数组中该日期上一次出现的值(前一个值)相加(我给出的示例可以更好地说明这一点)。
例如,假设有两个对象数组data1和data2,其中data2有一个日期的值而data1没有:
这种方法有一个问题,如果较小的数组有一个更大的数组中没有的日期,那么这个值就不会被添加到最终结果中。
更进一步讲,我开始循环一个数组(如前所示),然后再循环另一个数组以获取缺失的日期,但是这似乎过于复杂和低效。我相信有一种解决方案可以在一个循环中完成这个任务(甚至可以不使用循环)。
我想询问是否有人能够想出更好的解决方案,我是用JavaScript编写的。
当一个数组有某个日期的值而另一个数组没有时,我们将这一存在于一个数组中的值和另一个数组中该日期上一次出现的值(前一个值)相加(我给出的示例可以更好地说明这一点)。
例如,假设有两个对象数组data1和data2,其中data2有一个日期的值而data1没有:
var data1 = [
{date: "30-08-2019", value: 1},
{date: "03-09-2019", value: 2},
{date: "04-09-2019", value: 3}
]
var data2 = [
{date: "30-08-2019", value: 1},
{date: "02-09-2019", value: 2},
{date: "03-09-2019", value: 3},
{date: "04-09-2019", value: 4}
]
我希望将这两个数据相加的结果(data1 + data2)呈现为:
var result = [
{date: "30-08-2019", value: 2}, //{date: "30-08-2019", value: 1} + {date: "30-08-2019", value: 1}
{date: "02-09-2019", value: 3}, //{date: "30-08-2019", value: 1} + {date: "02-09-2019", value: 2}
{date: "03-09-2019", value: 5}, //{date: "03-09-2019", value: 2} + {date: "03-09-2019", value: 3}
{date: "04-09-2019", value: 7} //{date: "04-09-2019", value: 3} + {date: "04-09-2019", value: 4}
]
由于两个数组都是有序的,我的想法是循环拥有更多数据的数组,并将其与拥有较少数据的数组的值相加,同时跟踪较小数据给出的最后日期值,方法如下:
for(let i = 0; i < biggerData.length; i++){
//both have values for a date that exists the in bigger date array, so we sum them together
if(smallerData[i][biggerData[i].date]){
biggerData[i].value+=smallerData[i][biggerData[i].date];
lastValue = smallerData[i][biggerData[i].date];
//array with less data has a missing date, then sum the last saved value it gave
}else{
biggerData[i].value+=lastValue;
}
}
这种方法有一个问题,如果较小的数组有一个更大的数组中没有的日期,那么这个值就不会被添加到最终结果中。
更进一步讲,我开始循环一个数组(如前所示),然后再循环另一个数组以获取缺失的日期,但是这似乎过于复杂和低效。我相信有一种解决方案可以在一个循环中完成这个任务(甚至可以不使用循环)。
我想询问是否有人能够想出更好的解决方案,我是用JavaScript编写的。
.concat()
+ "javascript 按属性分组对象数组" - Andreas