@alpha-kappa

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

Имеется объект:
let cars = { 
    "car1":  {
      "doors": [red,green],
      "wheels": [blue,yellow]
    },
    "car2": {
      "wheels": [black]
    },
    "car3": {
      "doors": [], 
      "wheels": []
    },
    "car4": {}
  }

Необходимо отфильтровать его удалив "машины" с пустыми значениями свойств или без свойств, в примере выше это - "car3" и "car4".

Если бы это был массив можно было бы воспользоваться Array.prototype.filter():
cars.filter((car) => {
  // делаем проверку на наличие и заполненность свойств
  return "результат проверки";
})

Но у меня это объект, а у объектов нет метода filter.

На данный момент я придумал решение через массивы ключей: получаю массив ключей объекта, фильтрую его, после чего удаляю из объекта ключи, которых нет в отфильтрованном массиве ключей.
let carsKeys = Object.keys(cars);
let carsKeysFilterd = carsKeys.filter((key) => {
  // проверяем пункт cars[key] на соответствие требованиям
  return "результат проверки";
})
carsKeys.forEach((key) => {
  if (carsKeysFiltered.indexOf(key) === -1) delete cars[key];
})


Я понимаю что это, мягко говоря, не самое лаконичное решение, вот и пришёл к вам за помощью.

Как лучше организовать управление этим объектом в соответствии с заданными требованиями?

Уточнение мне это необходимо делать на серверной стороне. Возможно вы знаете для этого подходящий npm-модуль?
  • Вопрос задан
  • 7921 просмотр
Пригласить эксперта
Ответы на вопрос 3
larisamoroz
@larisamoroz
Курю маны, втыкаю в код, ваяю, починяю.
Object.filter = function( obj, filtercheck) {
    let result = {}; 
    Object.keys(obj).forEach((key) => { if (filtercheck(obj[key])) result[key] = obj[key]; })
    return result;
};

let carsFiltered = Object.filter(cars, filterFunc);

где filterFunc — ваша функция проверки, в которую передаётся только значение конкретного ключа
Ответ написан
evgeniy8705
@evgeniy8705
Повелитель вселенной
// Первое что пришло на ум. Вероятнее всего есть более оптимальное решение

let storage = {};

for (let car in cars) {
  for (let prop in cars[car]) {
    if (cars[car][prop].length != 0) {
      storage[car] = cars[car];
    }
  }
}

cars = storage;
Ответ написан
Yumeiro
@Yumeiro
Object.entries(cars).map(a=>Object.entries(a[1]).filter(b=>b[1].length).length?a:delete cars[a[0]]);

Не очень-то красивый, но однострочник.
Если нет свойств во вложенном объекте или они пустые, то свойство удаляется. Могу дописать, чтобы удаляло те свойства, в значениях которых есть хотя бы одно пустое свойство, код это особо не увеличит
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы