Проверьте, являются ли свойства в TypeScript Object пустыми - PullRequest
0 голосов
/ 27 февраля 2020

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

protected products: {
  color: string[],
  brand: number[],
} = {};

Я хочу проверить, являются ли свойства продуктов null (просто Array(0)). Как я могу это сделать?

Я использую "target": "es2015".

Ответы [ 3 ]

0 голосов
/ 27 февраля 2020

Можно попробовать это:

const checkEmptyObj = (object) => {
  // gets an array of the values for each kv pair in your object
  const values =  Object.values(object);

  // if you add kv pairs with non array types, will have to adjust this
  // removes all zero length arrays (or strings) from values array
  const nonEmptyValues = values.filter(value => value.length > 0)

  // if any items are in the nonEmptyValues array, return false
  return nonEmptyValues.length < 1
}

Это не всеобъемлющее решение, оно требует больше работы для использования, помимо заявленного вами случая. В частности, он работает только на объектах одного уровня. Если вы передаете вложенный объект, вам нужно настроить рекурсивную функцию. Если вы ожидаете, что у вас будут другие типы данных, вам придется выполнить некоторые из них внутри функции фильтра (вызов .length сбой, среди прочего, для чисел и объектов).

После более долгих размышлений мне нравится это решение больше.

return values.every(value => value.length === 0)
0 голосов
/ 27 февраля 2020

Для проверки, все ли массивы пусты, вы можете подойти к нему следующим образом:

Это предполагает, что все значения являются массивами

let products = {color: [],brand: []};
let allEmpty = Object.values(products).every(({length}) => !Boolean(length));
console.log(allEmpty);

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

{length} // Basically to extract the attribute length

Число 0 считается falsy, поэтому мы можем сделать явное приведение типов (или приведение типов) к значениям следующим образом:

!Boolean(length) // Coerce to boolean the number from arr.length
                 // The negation is needed because if the length === 0 that 
                 // means the array is empty, so we want the result 
                 // as true in our handler for the function every
0 голосов
/ 27 февраля 2020

Возможно, вы могли бы использовать loda sh _.isEmpty(value):

_.isEmpty(null);
// => true

_.isEmpty(true);
// => true

_.isEmpty(1);
// => true

_.isEmpty([1, 2, 3]);
// => false

_.isEmpty({ 'a': 1 });
// => false
...