Array.pu sh не работает в течение l oop в течение каждого l oop. Javascript - PullRequest
3 голосов
/ 17 января 2020

Я пытался передать sh массив из 3 значений в массив для создания AOA. Однако мой ожидаемый результат не получается правильным.

Входные данные выглядят примерно так:

[
{id:xxxxx,
date:VALUE,
date:VALUE,
..months worth
},
{id:xxxx2,
date:VALUE,
date:VALUE,
..months worth
},
..loads of entries
]

, пожалуйста, посмотрите фрагмент кода ниже.

arrayOfObjects.forEach(e =>{            
            let entry = [];
            entry[0] = e.id;            
            let PC = Object.values(e)        
            let Dates = Object.keys(e)
            PC.shift();
            Dates.shift();
            for(let i = 0; i <PC.length; i++){
                if(PC[i] === 'No Data'){
                    entry[2] = 0;
                    entry[1] = Dates[i];                   
                } else {
                    entry[2] = PC[i];
                    entry[1] = Dates[i];
                }
                finalArray.push(entry);
            }

        })

Я получаю массив выходных данных, которые содержат stati c date

[
  ...
  [ 'NAAAAD', '10/31/19', 0 ],
  [ 'NAAAAD', '10/31/19', 0 ],
  [ 'NAAAAD', '10/31/19', 0 ],
  [ 'NAAAAD', '10/31/19', 0 ],
  [ 'NAAAAD', '10/31/19', 0 ],
  [ 'NAAAAD', '10/31/19', 0 ],
  [ 'NAAAAD', '10/31/19', 0 ],
  ...
]

Когда я хочу увидеть приращение даты.

[
  ...
  [ 'NAAAAD', '10/25/19', 0 ],
  [ 'NAAAAD', '10/26/19', 0 ],
  [ 'NAAAAD', '10/27/19', 0 ],
  [ 'NAAAAD', '10/28/19', 0 ],
  [ 'NAAAAD', '10/29/19', 0 ],
  [ 'NAAAAD', '10/30/19', 0 ],
  [ 'NAAAAD', '10/31/19', 0 ],
  ...
]

У меня есть console.log(entry) как раз перед тем, как он будет помещен в массив, и в этот момент у меня есть правильная информация? Я переместил finalArray.push(entry) в оператор if непосредственно под строкой, в которой ввод правильный.

Что здесь происходит? Я не могу найти ничего подобного, я рассмотрел область действия переменных, но все они кажутся правильными.

Спасибо

Райан

Ответы [ 2 ]

3 голосов
/ 17 января 2020

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

arrayOfObjects.forEach(e =>{            
        let entry = [];
        entry[0] = e.id;            
        let PC = Object.values(e)        
        let Dates = Object.keys(e)
        PC.shift();
        Dates.shift();
        for(let i = 0; i <PC.length; i++){
            let newEntry = Object.assign([], entry);
            if(PC[i] === 'No Data'){
                newEntry[2] = 0;
                newEntry[1] = Dates[i];                   
            } else {
                newEntry[2] = PC[i];
                newEntry[1] = Dates[i];
            }
            finalArray.push(newEntry);
        }

    })
1 голос
/ 17 января 2020

вместо этого сложного подхода, почему бы вам просто не создать новую отдельную запись для каждой новой отдельной строки, которую вы хотите добавить в список.

arrayOfObjects.forEach(e => {
  for (let [key, value] of Object.entries(e)) {
    if (value === 'No Data') {
      value = 0; // change the variable `value`
    }
    // push a new row
    finalArray.push([ e.id, key, value ]);
  }
})

или

arrayOfObjects.forEach(e => {
  for (let [key, value] of Object.entries(e)) {
    finalArray.push([ e.id, key, value === 'No Data' ? 0 : value ]);
  }
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...