Удалите объекты с полем null внутри объекта объектов

#javascript #object

Вопрос:

у меня есть этот объект из объектов:

 fact: {
      brand: {
          old: ['CHERY'],
          new: ['CHERY','FORD']
      },
      year: {
          old: 2019,
          new: 2019,
      },
      km: {
          old: 90000,
          new: 90000,
      },
      model: {
          old: null,
          new: null
      },
      version: {
          old: null,
          new: null
      },
      color: {
          old: null,
          new: null
      }
},
 

Мне нужно каким-то образом выполнить итерацию по этому объекту и удалить объекты,содержащие поля с нулевыми значениями, чтобы результат был:

 fact: {
      brand: {
          old: ['CHERY'],
          new: ['CHERY','FORD']
      },
      year: {
          old: 2019,
          new: 2019,
      },
      km: {
          old: 90000,
          new: 90000,
      }
},
 

Я знаю, что если бы это был массив, процесс был бы проще с функцией map, но с объектом объектов я не знаю, есть ли функция, которая помогает в этом конкретном случае.

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

1. Вы все еще можете перебирать ключи объекта; в чем конкретная проблема? (Есть также библиотеки, которые абстрагируются от этого.)

Ответ №1:

если можно изменить существующий объект и схема всегда будет такой, как в примере, вы можете использовать это:

 for(let key in fact) {
  if(fact.hasOwnProperty(key) amp;amp; Object.values(fact[key]).some(v => v === null)) {
    delete fact[key]
  }
}
 

Ответ №2:

Просто выполните итерацию по объекту , а затем проверьте, содержит ли какое-либо из значений null , например:

 const data = {
  brand: {
    old: ['CHERY'],
    new: ['CHERY', 'FORD']
  },
  year: {
    old: 2019,
    new: 2019,
  },
  km: {
    old: 90000,
    new: 90000,
  },
  model: {
    old: null,
    new: null
  },
  version: {
    old: null,
    new: null
  },
  color: {
    old: null,
    new: null
  }
};

const containsNull = obj => {
  const values = Object.values(obj);
  return values.includes(null);
}

const parsedData = {};
for (const [key, obj] of Object.entries(data)) {
  if (!containsNull(obj)) parsedData[key] = obj
}

console.log(JSON.stringify(parsedData)) 
 >>> {"brand":{"old":["CHERY"],"new":["CHERY","FORD"]},"year":{"old":2019,"new":2019},"km":{"old":90000,"new":90000}}
 

Ответ №3:

Вы можете перебирать ключи объектов и для каждого свойства использовать метод Object.values (), который возвращает массив данного объекта. Для этого массива мы можем использовать функцию some, которая возвращает логическое значение, если условие истинно. (Я добавил !val на случай, если вы ищете какое-либо ложное значение, например, неопределенное и т. Д., В случае, если это не так, вы можете просто изменить его на val === null)

Затем просто используйте оператор delete, который удаляет свойство из объекта.

     let fact = {
      brand: {
          old: ['CHERY'],
          new: ['CHERY','FORD']
      },
      year: {
          old: 2019,
          new: 2019,
      },
      km: {
          old: 90000,
          new: 90000,
      },
      model: {
          old: null,
          new: null
      },
      version: {
          old: null,
          new: null
      },
      color: {
          old: null,
          new: null
      }
    };

    const cleanNulls = (obj) => {
       for (var prop in obj) {
          if (Object.values(obj[prop]).some(val => !val)) {
            delete obj[prop];
          }
       }
    }

    cleanNulls(fact);
    console.log(fact);