首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用于对象数组中特定日期之间数字的循环和。

用于对象数组中特定日期之间数字的循环和。
EN

Stack Overflow用户
提问于 2018-10-05 18:46:20
回答 2查看 532关注 0票数 1

以下是来自服务器的JSON格式数据的示例:

代码语言:javascript
复制
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. 我怎么才能得到数字之和。 我试过: info = infom.info;var sum = 0;for (var i= 0;i< info.length;i++) { inf =info i;n1 = parseInt(inf.number);console.log(sum+=n1);} 这将打印数字:1, 3, 6, 10。 我怎样才能得到10而不是1, 3, 6
  2. 我怎样才能在某一特定日期之前/之后得到数字。* 例如,在2018-10-32 + 1 = 3之后的数字之和
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-10-05 19:01:31

重要事项:请注意来自@RobG的评论,它涉及比较ISO8601日期字符串的能力,以避免与Date.parse有关的问题。请参阅下面更新的答复,以反映这一评论,下面是原始答复,以供参考。

更新:

下面的示例将删除与原始数据相比的日期解析步骤。

代码语言:javascript
复制
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的日期字符串,格式与其他数据相同,但您可以将其转换为函数,并将日期作为参数传递,并确定在比较日期之前还是之后是否要和日期)。

例如:

代码语言:javascript
复制
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中使用的变量(或者更好地声明letconst)。

代码语言:javascript
复制
var info = info.info;
var sum = 0;
for (var i = 0; i < info.length; i++) {
  sum += parseInt(info[i].number);
}

console.log(sum);
// 10
票数 1
EN

Stack Overflow用户

发布于 2018-10-05 23:35:26

我怎么能得到10,而不是1,3,6?

将console.log移出循环。您还可以大大简化代码:

代码语言:javascript
复制
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格式的日期字符串可以按字典顺序进行比较。如果以相同格式提供比较日期,则避免日期对象和解析:

代码语言:javascript
复制
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时间戳,所以在与“本地”日期进行比较时要小心,因为“本地”日期可能会被抵消,并产生意想不到的结果。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52671647

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档