Почему метод сплайсинга не работает и удаляет элемент массива в TypeScript - PullRequest
1 голос
/ 24 февраля 2020

У меня есть тип массива Person, у которого есть некоторые данные. Пример:

const people = [{name: "John", age: "18"},{name: "Mike", content: "20"},{label: "Brand", content: "18"},{label: "Alice", content: "50"},{label: "Zina", content: "10"}];

У меня есть другой тип массива строки [], который имеет следующие данные: names=["John", "Zina"];

Я пытаюсь удалить имена, которые находятся во втором массиве из Первый массив, как это:

  for (let i = 0; i < people.length; i++) {
    for (let j = 0; j < names.length; j++) {
      if (names[j] === people[i].name) {
        people.splice(i);
      }
    }
  }

Почему это не работает?

Ответы [ 4 ]

2 голосов
/ 24 февраля 2020

Если вы хотите сохранить ссылку на объект с people, вы можете повторить people с конца, потому что Array#splice с элементами для удаления изменяет индексы следующих элементов.

var people = [{ name: "Mike", content: "20" }, { label: "Brand", content: "18" }, { label: "Alice", content: "50" }, { label: "Zina", content: "10" }],
    names = ["John", "Zina"],
    i = people.length;

while (i--) {
    if (names.includes(people[i].name) || names.includes(people[i].label)) {
        people.splice(i, 1);
    }
}

console.log(people);
.as-console-wrapper { max-height: 100% !important; top: 0; }
1 голос
/ 24 февраля 2020

Метод splice изменяет массив на месте . Я предлагаю вам использовать filter метод.

const people = [{name: "John", age: "18"},{name: "Mike", content: "20"},{name: "Brand", content: "18"},{name: "Alice", content: "50"},{name: "Zina", content: "10"}], names=["John", "Zina"];


console.log(people.filter(({name}) => !names.includes(name)));
0 голосов
/ 24 февраля 2020

Splice изменяет исходный массив. т. е. на каждой итерации, если условие возвращает true, массив people с этим индексом заменяется неопределенным и, следовательно, появляется ошибка.

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

 for (let i = 0; i < people.length; i++) {
    for (let j = 0; j < names.length; j++) {
      if (names[j] === people[i].name) {
     console.log("matched",names[j],people[i].name, people.slice(i,i+1),);
      }
    }
  }

или вы можете просто фильтровать данные, используя метод Filter.

0 голосов
/ 24 февраля 2020

Пожалуйста, обратитесь ниже код.

const people = [{name: "John", age: "18"},{name: "Mike", content: "20"},{label: "Brand", content: "18"},{label: "Alice", content: "50"},{label: "Zina", content: "10"}];
const names = ["Mike","Shiv"];

for (let i = 0; i < people.length; i++) {
debugger
    for (let j = 0; j < names.length; j++) {
      if (names[j] === people[i].name) {
        people.splice(i,1);
      }
    }
  }
 console.log(people)
...