簡體   English   中英

對於對象數組中特定日期之間的數字循環求和

[英]For loop sum of numbers between specific dates in array of objects

這是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. 如何獲得數字的總和。

    我努力了:

     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-3之后的數字之和: 2 + 1 = 3

重要提示:請注意@RobG的注釋,該注釋可按詞法比較ISO 8601日期字符串,以避免Date.parse問題。 請參閱下面的更新答案以反映該評論,以下原始答案供參考。

更新:

以下示例與原始示例相比,刪除了日期解析步驟。

 var 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" } ] }; let sum = info.info.reduce((acc, obj) => { acc += parseInt(obj.number); return acc; }, 0); console.log('sum', sum); let sumDate = info.info.reduce((acc, obj) => { if (obj.date >= '2018-10-03T00:00:00.000Z') { acc += parseInt(obj.number); } return acc; }, 0); console.log('sumDate', sumDate); 

原版的:

您需要解析日期字符串以進行比較,然后可以使用reduce 如果您喜歡for循環,請在代碼段下方查看一些原始說明,並提供一些快速解釋(因為它僅適用於所有值的求和-您可以使用與reduce方法相同的原理修改for循環) 。

sum低於只是讓所有的總和number的對象數組(如何使用相當簡單的例子,在性能reduce )。 下面的sumDate添加了一個if語句,用於比較對象數組中的date屬性,然后在總和中包含相應的number (只是以與其他數據相同的格式對2018-10-3的日期字符串進行了硬編碼,但是您可以將其打開到函數中,然后將日期作為參數傳遞,並確定是對比較日期之前還是之后的日期求和。

例如:

 var 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" } ] }; let sum = info.info.reduce((acc, obj) => { acc += parseInt(obj.number); return acc; }, 0); console.log('sum', sum); let 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('sumDate', sumDate); 

要更正原始的for循環嘗試,主要問題是您沒有增加sum變量。 另外,不要忘了用var聲明要使用的變量(或者用letconst更好地聲明)。

var info = info.info;
var sum = 0;
for (var i = 0; i < info.length; i++) {
  sum += parseInt(info[i].number);
}
console.log(sum);
// 10

我怎樣才能只得到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格式的日期字符串。 如果比較日期以相同的格式提供,則避免使用Date對象和解析:

 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時間戳記,因此在與可能會偏移並產生意外結果的“本地”日期進行比較時要小心。

暫無
暫無

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

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