以下是来自服务器的JSON格式数据的示例:
var infom = {
"info": [
{
"date":"2018-10-04T00:00:00.000Z",
"number":"1"
},
{
"date":"2018-10-03T00:00:00.000Z",
"number":"2"
},
{
"date":"2018-10-02T00:00:00.000Z",
"number":"3"
},
{
"date":"2018-10-01T00:00:00.000Z",
"number":"4"
}
]
};1, 3, 6, 10。
我怎样才能得到10而不是1, 3, 62018-10-3:2 + 1 = 3之后的数字之和发布于 2018-10-05 19:01:31
重要事项:请注意来自@RobG的评论,它涉及比较ISO8601日期字符串的能力,以避免与Date.parse有关的问题。请参阅下面更新的答复,以反映这一评论,下面是原始答复,以供参考。
更新:
下面的示例将删除与原始数据相比的日期解析步骤。
const info = {"info": [{ "date": "2018-10-04T00:00:00.000Z", "number": "1" }, { "date": "2018-10-03T00:00:00.000Z", "number": "2" }, { "date": "2018-10-02T00:00:00.000Z", "number": "3" }, { "date": "2018-10-01T00:00:00.000Z", "number": "4" } ] };
const sum = info.info.reduce((acc, obj) => {
acc += parseInt(obj.number);
return acc;
}, 0);
const sumDate = info.info.reduce((acc, obj) => {
if (obj.date >= '2018-10-03T00:00:00.000Z') {
acc += parseInt(obj.number);
}
return acc;
}, 0);
console.log('sum', sum);
console.log('sumDate', sumDate);
原件:
您需要使用解析日期字符串进行比较,然后只需使用reduce即可。如果您更喜欢for循环,请参阅对原始代码的更正,并在代码段下面进行一些快速解释(因为它适用于所有值的求和--您可以使用与reduce方法中相同的原则修改for循环)。
下面的sum只得到对象数组中所有number属性的总和(关于如何使用reduce的简单示例)。下面的sumDate添加了一条if语句来比较对象数组中的date属性,然后在和中包含相应的number (只是硬编码了2018-10-3的日期字符串,格式与其他数据相同,但您可以将其转换为函数,并将日期作为参数传递,并确定在比较日期之前还是之后是否要和日期)。
例如:
const info = {"info": [{ "date": "2018-10-04T00:00:00.000Z", "number": "1" }, { "date": "2018-10-03T00:00:00.000Z", "number": "2" }, { "date": "2018-10-02T00:00:00.000Z", "number": "3" }, { "date": "2018-10-01T00:00:00.000Z", "number": "4" } ] };
const sum = info.info.reduce((acc, obj) => {
acc += parseInt(obj.number);
return acc;
}, 0);
const sumDate = info.info.reduce((acc, obj) => {
if (Date.parse(obj.date) >= Date.parse('2018-10-03T00:00:00.000Z')) {
acc += parseInt(obj.number);
}
return acc;
}, 0);
console.log('sum', sum);
console.log('sumDate', sumDate);
要更正原始的for循环尝试,主要问题是没有增加sum变量。另外,不要忘记声明您在var中使用的变量(或者更好地声明let或const)。
var info = info.info;
var sum = 0;
for (var i = 0; i < info.length; i++) {
sum += parseInt(info[i].number);
}
console.log(sum);
// 10发布于 2018-10-05 23:35:26
我怎么能得到10,而不是1,3,6?
将console.log移出循环。您还可以大大简化代码:
var infom = {"info":[
{"date":"2018-10-04T00:00:00.000Z","number":"1"},
{"date":"2018-10-03T00:00:00.000Z","number":"2"},
{"date":"2018-10-02T00:00:00.000Z","number":"3"},
{"date":"2018-10-01T00:00:00.000Z","number":"4"}
]};
var info = infom.info;
var sum = 0;
for (var i = 0; i < info.length; i++) {
sum += parseInt(info[i].number);
}
console.log(sum);
我怎样才能在某一特定日期之前/之后得到数字。*
ISO 8601格式的日期字符串可以按字典顺序进行比较。如果以相同格式提供比较日期,则避免日期对象和解析:
var infom = {"info":[
{"date":"2018-10-04T00:00:00.000Z","number":"1"},
{"date":"2018-10-03T00:00:00.000Z","number":"2"},
{"date":"2018-10-02T00:00:00.000Z","number":"3"},
{"date":"2018-10-01T00:00:00.000Z","number":"4"}
]};
function getSumAfter(data, date) {
return data.reduce(function(acc, obj) {
if (obj.date.localeCompare(date) > 0) {
acc += +obj.number;
}
return acc;
}, 0);
}
console.log(getSumAfter(infom.info,'2018-10-02T00:00:00.000Z')); // 3
// Which can be reduced to
function getSumAfter2(data, date) {
return data.reduce((acc, obj) => obj.date.localeCompare(date) > 0? acc += +obj.number : acc, 0);
}
console.log(getSumAfter2(infom.info,'2018-10-02T00:00:00.000Z')); // 3
但是,第二个产品的可维护性可能较低。
您还在使用UTC时间戳,所以在与“本地”日期进行比较时要小心,因为“本地”日期可能会被抵消,并产生意想不到的结果。
https://stackoverflow.com/questions/52671647
复制相似问题