Использование javascript forEach и склейка многомерного массива - PullRequest
2 голосов
/ 27 января 2020

Я пытаюсь l oop на некоторые данные, которые выглядят так:

[0]['fields']['status']['name'] = 'In progress'
[1]['fields']['status']['name'] = 'In progress'
[2]['fields']['status']['name'] = 'In review'
[3]['fields']['status']['name'] = 'In progress'
[4]['fields']['status']['name'] = 'In review'

Я использую следующий foreach l oop, чтобы объединить все бесполезные индексы, в данном случае все из них.

issues.forEach(function (item, index) {
   if (issues[index]['fields']['status']['name'] !== "Done") {
       issues.splice(index, 1);
   }
});

Если я позже перейду по массиву oop, я смогу вывести «В процессе» и «В проверке», что странно, потому что они должны быть сброшены. Я думаю, что это происходит, потому что я манипулирую массивом при его использовании. Может ли кто-нибудь объяснить, что не так и как этого можно избежать.

Ответы [ 2 ]

4 голосов
/ 27 января 2020

Просто l oop с конца с индексом.

Это предотвращает невидимые индексы и сохраняет индекс там, где он принадлежит.

var index = issues.length;

while (index--) {
    if (issues[index].fields.status.name !== "Done") {
        issues.splice(index, 1);
    }
}
3 голосов
/ 27 января 2020

Одним из возможных решений является замена метода forEach на while l oop, поскольку при использовании splice это изменит массив issues inplace, а вы skip некоторые элементы.

Я продемонстрировал это в следующем примере.

let arr = [1,2,3,4]
arr.forEach((item, index) => {
  arr.splice(index, 1);
});
console.log(arr);

Решение

let i = 0;
while(i < issues.length){
   if (issues[i]['fields']['status']['name'] !== "Done") {
       issues.splice(i, 1);
   }
   else i++;
}
...