Для цикла сумма чисел между конкретными датами в массиве объектов - PullRequest
0 голосов
/ 05 октября 2018

Вот пример данных с сервера в формате 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

Ответы [ 2 ]

0 голосов
/ 06 октября 2018

Как получить только 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, поэтому будьте осторожны при сравнении с «локальными» датами, которыеможет быть смещено и привести к неожиданным результатам.

0 голосов
/ 05 октября 2018

ВАЖНО: Обратите внимание на комментарий от @ 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...