Задать вопрос
massef
@massef

Как удалить объект из массива если в свойстве объекта присутствует null?

https://codepen.io/anon/pen/KZWvvG?editors=0010

Нужно очистить массив от null и undefined
С массивом arr1 все получилось, а с arr2 не работает, потому что в массив приходят объекты.
Не знаю как пройтись по свойствам, выявить null и undefined и если они есть, то удалить их объект полностью из массива.

UPD:
Если раскомментировать 7 строчку - arr2.push(key.name) и закоментировать 8ю
то в arr2 попадут значения из свойства name, но почему то очистка уже не работает arr2.clean(), почему так происходит?
  • Вопрос задан
  • 557 просмотров
Подписаться 1 Простой Комментировать
Решения вопроса 2
rockon404
@rockon404
Frontend Developer
var filteredArray = sourceArray.filter(function(e) {
  return e.someKey !== null && e.someKey !== undefined;
});


По поводу ваших велосипедов с Array.prototype.clean. Оставьте эту затею, так делать не принято. Ваша функция clean, помимо null и undefined удаляет из массива элементы со значением 0 и пустые строки.
Используйте функцию filter.
Ответ написан
0xD34F
@0xD34F Куратор тега JavaScript
Если проверяется одно свойство:

const key = 'имя какого-то свойства';
const checkItem = n => n[key] != null;

// собираем новый массив
const newArr = arr.filter(checkItem);

// обновляем существующий
for (let i = 0; i < arr.length; i++) {
  if (!checkItem(arr[i])) {
    for (let j = i--; ++j < arr.length; arr[j - 1] = arr[j]) ;
    arr.pop();
  }
}

Несколько свойств:

const keys = [ 'имя какого-то свойства', 'ещё одно', 'и ещё' ];
const checkItem = n => keys.every(k => n[k] != null);

// собираем новый массив
const newArr = [];
for (const n of arr) {
  if (checkItem(n)) {
    newArr.push(n);
  }
}

// обновляем существующий
arr.splice(0, arr.length, ...arr.filter(checkItem));

Все свойства:

const checkItem = n => !Object.values(n).some(v => v == null);

// собираем новый массив
const newArr = (function get(i, n = arr[--i]) {
  return i >= 0
    ? get(i).concat(checkItem(n) ? n : [])
    : [];
})(arr.length);

// обновляем существующий
arr.length -= arr.reduce((acc, n, i, a) => (
  a[i - acc] = n,
  acc + !checkItem(n)
), 0);
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы