JavaScript — Как мне удалить объекты из массива, которые содержат определенную строку?

#javascript #arrays #loops #object

#javascript #массивы #циклы #объект

Вопрос:

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

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

В конце я хочу, чтобы массив содержал только

 [  
    name: "Tiffany", status: "Clean",
    name: "Space-man", status: "Clean",
    name: "Soap-man", status: "Clean",
]
  

 let myArray = [
     {name: "Timmy", status: "Smelly"},
     {name: "Tiffany", status: "Clean"},
     {name: "Kyle", status: "Smelly"},
     {name: "Space-man", status: "Clean"},
     {name: "Soap-man", status: "Clean"},
]

while (i = 0) {
  try {
    let find = myArray.findIndex(i => i.status === `Smelly`);
    myArray.splice(find, 1);
  } catch {
    i = 1;
  }
}
console.log(myArray)  

Комментарии:

1. Просто отфильтруйте его..

Ответ №1:

Вы можете получить результат с помощью Array.filter

 const value = [
  {name: "Timmy", status: "Smelly"},
  {name: "Tiffany", status: "Clean"},
  {name: "Kyle", status: "Smelly"},
  {name: "Space-man", status: "Clean"},
  {name: "Soap-man", status: "Clean"}
];

const result = value.filter((item) => item.status !== 'Smelly');
console.log(result);  

Ответ №2:

Используйте filter как:

  let myArray = [
 {name: "Timmy", status: "Smelly"},
 {name: "Tiffany", status: "Clean"},
 {name: "Kyle", status: "Smelly"},
 {name: "Space-man", status: "Clean"},
 {name: "Soap-man", status: "Clean"},
 ]

let result = myArray.filter(i => i.status !== 'Smelly');
console.log(result)  

Ответ №3:

Если вы хотите сохранить ссылку на объект массива, вы можете выполнить итерацию с конца массива.

Array#slice изменяет индексы, если они объединены с самого начала.

 let array = [{ name: "Timmy", status: "Smelly" }, { name: "Tiffany", status: "Clean" }, { name: "Kyle", status: "Smelly" }, { name: "Space-man", status: "Clean" }, { name: "Soap-man", status: "Clean" }],
    i = array.length;

while (i--) if (array[i].status === `Smelly`) array.splice(i, 1);

console.log(array);  
 .as-console-wrapper { max-height: 100% !important; top: 0; }  

Комментарии:

1. Это звучит НАМНОГО тяжелее, чем array = array.filter(...)

2. Но то же самое делает array = array.filter()

3. Хорошо, если вы так говорите. Это важно, почему?

4. потому что op хочет объединить. это не изменяет ссылку.

Ответ №4:

Просто отфильтруйте его

Вы можете создать новый отфильтрованный массив или заменить существующий

 let myArray = [ {name: "Timmy", status: "Smelly"}, {name: "Tiffany", status: "Clean"}, {name: "Kyle", status: "Smelly"}, {name: "Space-man", status: "Clean"}, {name: "Soap-man", status: "Clean"}]

// filter into a new array

const cleanArray = myArray.filter(item => item.status !== "Smelly")

console.log(cleanArray)
 
// or replace:
 
myArray = myArray.filter(item => item.status !== "Smelly")

console.log(myArray)  

Ответ №5:

Прежде всего, вам нужно иметь логическое значение в цикле while. Таким образом, вы можете добавить счетчик, начинающийся с 0, и запускать цикл, пока счетчик меньше длины массива .

Вот код:

 let myArray = [
    { name: "Timmy", status: "Smelly" },
    { name: "Tiffany", status: "Clean" },
    { name: "Kyle", status: "Smelly" },
    { name: "Space-man", status: "Clean" },
    { name: "Soap-man", status: "Clean" },
]

let counter = 0;

while (counter < myArray.length) {
  let find = myArray.findIndex(i => i.status === `Smelly`);
  if (find != -1) {
    myArray.splice(find, 1);
  } else {
    counter  ;
  }
}

myArray.forEach(el => console.log(el));  

Комментарии:

1. это слишком сложно для чего-то настолько простого

Ответ №6:

splice дорого.Он должен сдвинуть все последующие элементы после того, который вы удалили. И вы делаете это в цикле.

Большую часть времени я бы использовал Array#filter . Это просто и безопасно; никаких неожиданных побочных эффектов, когда я «удаляю» элементы из списка (например, что-то исчезает, потому что я забыл, что какой-то другой код также использует этот список).

Но иногда я явно хочу или должен изменить сам список. Вот небольшая служебная функция для этого:

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

 const value = [
  {name: "Timmy", status: "Smelly"},
  {name: "Tiffany", status: "Clean"},
  {name: "Kyle", status: "Smelly"},
  {name: "Space-man", status: "Clean"},
  {name: "Soap-man", status: "Clean"}
];

function filterInPlace(array, predicate) {
  let j = 0;
  for (let i = 0; i < array.length;   i) {
    if (i in array amp;amp; predicate(array[i], i, array)) {
      if (i !== j) {
        array[j] = array[i];
      }
        j;
    }
  }
  array.length = j;
  return array;
}

const result = filterInPlace(value, (item) => item.status !== 'Smelly');

console.log(result === value);
console.log(result);