Как удалить объект из массива если в свойстве объекта присутствует null?
Нужно очистить массив от null и undefined
С массивом arr1 все получилось, а с arr2 не работает, потому что в массив приходят объекты.
Не знаю как пройтись по свойствам, выявить null и undefined и если они есть, то удалить их объект полностью из массива.
UPD:
Если раскомментировать 7 строчку — arr2.push(key.name) и закоментировать 8ю
то в arr2 попадут значения из свойства name, но почему то очистка уже не работает arr2.clean(), почему так происходит?
- Вопрос задан более трёх лет назад
- 362 просмотра
Комментировать
Решения вопроса 1
Frontend Developer
var filteredArray = sourceArray.filter(function(e) < return e.someKey !== null && e.someKey !== undefined; >);
По поводу ваших велосипедов с Array.prototype.clean. Оставьте эту затею, так делать не принято. Ваша функция clean, помимо null и undefined удаляет из массива элементы со значением 0 и пустые строки.
Используйте функцию filter.
Ответ написан более трёх лет назад
Нравится 2 2 комментария
massef @massef Автор вопроса
Антон Спирин Cпасибо, помогло. Слышал что фильтр медленный, если большой объект данных нужно отфильтровать.
Не подскажете по второму вопросу (без учета вашего кода). Просто интересно почему так выходит.
JavaScript: как удалить значения из массива
Массивом называется упорядоченный тип данных, хранящий несколько значений. Это означает, что каждый элемент в массиве имеет числовой идентификатор (индекс), который используется для ссылки на его место в строке.
Массивы начинаются с индекса 0 и увеличиваются на 1 для каждого значения. Для обращения к значению в массиве воспользуйтесь соответствующим индексом и заключите его в квадратные скобки [] .
let numbers = [10,20,30,40];// выводит значение с явным указанием индекса
console.log(numbers[0]); # 10
console.log(numbers[1]); # 20
console.log(numbers[2]); # 30
console.log(numbers[3]); # 40// другой способ: цикл for
for(let i=0; i console.log(numbers[i]);
>
Но что, если мы захотим удалить значение из нашего массива? Для этого существует четыре способа, каждый из которых имеет свои плюсы и минусы, о которых поговорим ниже.
Примечание: все четыре способа доступны без какого-либо импорта дополнительных библиотек.
Через ключевое слово delete
Если вы не любите сложностей, то воспользуйтесь простейшим методом удаления значений из массива — ключевым словом delete . Вам нужно всего лишь указать имя переменной с индексом, который хотите удалить.
let numbers = [1,2,3,4];delete numbers[1];
console.log(numbers); // [1, undefined, 3, 4]
Но будьте внимательны. Несмотря на кажущуюся простоту данного способа, он часто приводит к лишней головной боли, поскольку теперь в вашем массиве зияет дыра.
Основной вывод: при удалении значения из массива через delete задайте себе вопрос: «Нужно ли мне переиндексировать массив?».
Через метод pop()
Вам нужно удалить самое большое индексное значение из массива? Или же вы хотите переиндексировать массив так, чтобы избавиться от undefined в конце? Тогда метод pop() — это то, что доктор прописал.
let numbers = [1,2,3,4];numbers.pop();
console.log(numbers); // [1,2,3]
Через метод splice()
Если вы хотите удалить определенное значение из массива, а не конкретный индекс, и вы готовы к переиндексации массива, то присмотритесь к методу splice() .
Сплайсинг массива создает новый массив, который удаляет некое количество значений и обрезает массив слева, начиная с определенного индекса.
let numbers = [1,2,3,4];numbers.splice(2);
console.log(numbers); // [1,2]
Если же вы хотите удалить только одно значение, то воспользуйтесь вторым (не обязательным) параметром в методе splice() .
let numbers = [1,2,3,4];numbers.splice(2,1);
console.log(numbers); // [1,2,4]
Обратите внимание, что мы не выводим результат массива сразу. Это потому, что данный метод будет возвращать удаленные значения.
let numbers = [1,2,3,4];console.log(numbers.splice(2,1)); // [3]
Все, конечно, круто и здорово, однако в реальных примерах вам, вряд ли, удастся захардкодить значение индекса. Поэтому давайте воспользуемся методом indexOf() для поиска индекса значения, соответствующего условию.
// удаляет значение 3 из массива let numbers = [1,2,3,4];
i = numbers.indexOf(3);
if(i >= 0) numbers.splice(i,1);
>
console.log(numbers); // [1,2,4]
Условие if в этом коде используется для того, чтобы подтвердить нахождение значения в массиве. Если же значение не найдено, то метод indexOf() вернет -1 . Таким образом, если i больше или равно 0 , то это значение было найдено в массиве.
Через метод filter()
Метод splice() весьма удобен для нахождения и удаления одного значения. Но бывает так, что вам нужно удалить все вхождения значения (или условия) из массива. В таком случае, вашим новым другом станет метод filter() .
Этот метод принимает функцию в качестве аргумента и сохраняет значения, соответствующие true в функции filter . Чтобы отфильтровать определенное значение, необходимо проверить отрицательные индексы.
let numbers = [1,2,3,4];
numbers = numbers.filter((n) => );
console.log(numbers); // [1,2,4]
Обратите внимание, что нам приходится заново присваивать номера индексов. Дело в том, что, в отличие от метода splice() , filter() возвращает новый массив, а не выполняет действия с исходными данными.
Заключение
Это не все способы удаления значений из массива, но и среди указанных можете выбрать метод по душе или же придумать что-то свое.
- Зачем нужен Strict Mode в JavaScript?
- Малоизвестные функции JavaScript
- Условный JavaScript для экспертов
JavaScript | Как удалить элемент массива?
Нам нужно удалить элемент со значением 77 и сдвинуть оставшуюся часть влево (ближе к началу).
Сделать это можно при помощи метода filter() :
arr.filter(i => i != 77)
В фильтр мы передаём стрелочную функцию, в которой проверяем Нам вернётся новый массив, без элемента со значением 77. «Пустот или дыр» в массиве не будет.
Важно! Метод filter() не изменяет оригинальный массив. Он просто вызывается на оригинальном массиве, но возвращает всегда новый экземпляр. Это говорит о том, что вызов метода filter() никак не влияет на оригинальный массив.
Поэтому, чтобы изменить оригинальный массив, нужно написать выражение:
arr = arr.filter(i => i != 77)
Способ № 2 — использование оператора delete
Мы можем удалить значение элемента из массива при помощи оператора delete . Для этого мы пишем слово delete и справа от него пишем конструкцию, которая будет обращаться к нужному нам элементу массива. Стандарт ECMAScript — Раздел «13.5.1 The delete Operator» — https://tc39.es/ecma262/#sec-delete-operator
В нашем случае мы хотим удалить значение из первого элемента массива. Поэтому мы должны обратиться к индексу 0 (ноль).
var massiv = [1, 2, 3, 4] delete massiv[0] [empty, 2, 3, 4]
Из оригинального массива мы удалили нужное нам значение элемента, но теперь в массиве образовалась «дырка». Браузер нам подсвечивает эту дырку словом «empty«. Если сейчас попытаться обратиться к первому элементу массива, то мы получим undefined, т. к. такого значения элемента уже не существует.
Мы успешно удалили ЗНАЧЕНИЕ элемента массива. Причём удобно то, что все оставшиеся элементы массива не изменили своего положения. Значения лежат под теми же индексами.
Информационные ссылки
Стандарт ECMAScript — Раздел «ReservedWord» (Зарезервированные слова) — https://tc39.es/ecma262/#prod-ReservedWord
Вам также может понравиться
Опубликовано 19.03.2021
JavaScript | Как сложить все нечётные числа в массиве?
Дано Есть массив: var massiv = [11, 4, 5, 0, 7.12, 6.4] Мы хотим узнать сумму всех целых чисел, которые НЕ делятся […]
Опубликовано 09.01.2022
canvas | Манипуляции с пикселями
Для веб-разработчиков (не нормативно) imagedata = new ImageData(sw, sh [, settings]) Возвращает объект ImageData с заданными размерами и цветовым пространством, указанным в настройках settings. Все пиксели в […]
Опубликовано 10.04.2021
ECMAScript | Объектные записи среды
Каждая Объектная запись среды (object Environment Record) связана с объектом, который называется его связывающим объектом (binding object). Объектная запись среды связывает набор […]
Опубликовано 04.03.2021
JavaScript | Минимальное число в массиве?
Как узнать, какое число в массиве является минимальным? Задача решается при помощи метода sort() для объектов-прототипов Array. Решение задачи — […]
Как правильно удалить ключ у объекта с помощью delete
Всем привет, с вами JSExpert и сегодня в коротком уроке мы рассмотрим один интересный вопрос, а именно как удалить ключ объекта и как не нужно удалять элементы массива.
Для удаления элементов можно использовать ключевое слово delete. Но есть нюанс. Давайте рассмотрим на примере:
const index = < k1: 'first', k2: 'second', k3: 'last' >; const letters = ['a', 'b', 'c'];
У нас есть простой объект index, с ключами k1, k2, k3 и массив letters, с значениями ‘a’, ‘b’, ‘c’.
Давайте удалим ключ с объекта index. Для этого пишем перед именем объекта ключевое слово delete, а после имени объекта через точку указываем ключ, который хотим удалить, в нашем случае это ключ k2.
delete index.k2; console.log(index);
Выведем результат в консоль:
Как видим, ключ удалился и мы получили желаемый результат. Теперь, попробуем сделать тоже самое с массивом letters и удалим элемент с индексом 1.
delete letters[1]; console.log(letters, letters.length);
В консоли выведем результат, а именно сам массив letters и его длину:
[ 'a', undefined, 'c' ] 3
Тут нас ожидает сюрприз. Применяя delete к определённому индексу массива вы не удаляете элемент, вы удаляете значение самого элемента, и оно становится пустым, а именно undefined. Длина массива же остаётся неизменной. По сути, мы не удалили элемент, а сделали его пустым и он всё так же по прежнему находится в массиве.
В одном из следующих видео мы покажем вам один из возможных способов, как правильно удалять элемент из массива.
На этом сегодня всё, всем пока!