ВАЖНО: Обратите внимание на комментарий от @ 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, посмотрите исправления к исходному коду с кратким объяснением ниже фрагмента (поскольку это относится только к суммированию всех значений - вы можете изменить цикл for с помощью тех же принципов, которые приведены ниже в reduce
подход).
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);
Чтобы исправить исходный код для попытки зацикливания, основной проблемой было то, что вы не увеличивали переменную 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