Динамически созданный объект не заполнен как ожидалось - PullRequest
0 голосов
/ 21 мая 2018

Я пытаюсь извлечь данные из одного объекта, реструктурировать и создать новый.

Упрощенный пример для исходного объекта

var res = [{
    DateTime: '00:00',
  Number: 1,
  WeekDay: 1
},
{
    DateTime: '00:00',
  Number: 4,
  WeekDay: 1
},
{
    DateTime: '00:00',
  Number: 1,
  WeekDay: 2
},
{
    DateTime: '00:30',
  Number: 1,
  WeekDay: 2
}]

Отсюда я хочу создать новый объектгде «число» суммируется как 1. WeekDay 2. Полчасовой интервал

var intervals = ['00:00', '00:30']
var weekdays = [1, 2]

var target = []
var intervalObj = [];
    for (i = 0; i < intervals.length; i++) {
        intervalObj.push({
            interval: intervals[i],
            number: 0
        })
      }

 for (i = 0; i < weekdays.length; i++) {
 var day = i + 1;
        target.push({
                day: day,
            data: intervalObj,
        })
      }

И затем заполнить новый объект следующим образом:

for(var row in res) {
    var dt = res[row].DateTime;
  var wd = res[row].WeekDay;
  var wdidx = weekdays.indexOf(wd)
  var dtidx = intervals.indexOf(dt)
  var num = res[row].Number;

  target[wdidx].data[dtidx].number += num;
}

Это не работает при создании целиобъект, как указано выше.Суммированные результаты повторяются для одного и того же интервала в течение всех дней недели.Тем не менее, когда объект статически:

var target = [{
  day: 1,
  data: [{
    interval: '00:00',
    number: 0
  },
  {
    interval: '00:30',
    number: 0
}]
},
{
  day: 2,
  data: [{
    interval: '00:00',
    number: 0
  },
  {
    interval: '00:30',
    number: 0
  }]
}]

Он работает, как ожидалось.Я не могу понять, почему.Вот пример скрипки: https://jsfiddle.net/oceansmoving/wkfL9e3o/

1 Ответ

0 голосов
/ 21 мая 2018

Вы используете одну и ту же ссылку на массив intervalObj для data в каждом экземпляре цикла.Необходимо создать новый массив для каждого экземпляра

Изменить

var intervalObj = [];
for (i = 0; i < weekdays.length; i++) {
  var day = i + 1;
  target.push({
    day: day,
    data: intervalObj,
  })
}

На

//var intervalObj = [];
for (i = 0; i < weekdays.length; i++) {
  var day = i + 1;
  target.push({
    day: day,
    data: [],
  })
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...