#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);