JS - Проверить неизвестный объект, на наличие полей с типом null

Детали: Имею массив объектов, с неизвестной вложенностью. Поля в объектах имеют либо значение, либо null.

Пример: Пример объектов

Проблема: Мне нужна функция, которая пробежится по этим самым объектам, и вернет true или false, в зависимости от того, заполнено ли хотя бы 1 поле.

К примеру:

{ text: null } -> false
{ text: 'foo' } -> true

Или

{ field: { text: null } } -> false
{ field: { text: 'foo' } } -> true

Благодарю за ответы! Вы делаете мир лучше!


Ответы (1 шт):

Автор решения: OPTIMUS PRIME

Не придумал название для функции) Она должна вернуть true, если обнаружит хотя бы одно примитивное значение, которое не null.

console.log( bubu( {a: {a: null, b: null}, b: null} ) ); // false;
console.log( bubu( [null] ) ); // false;
console.log( bubu( {a: document.querySelector("moo")} ) ); // false;

console.log( bubu( {a: {a: 'hi', b: null}, b: null} ) ); // true;
console.log( bubu( {a: ['hi', null]} ) ); // true;
console.log( bubu( {a: undefined} ) ); // true - не null;

/***/
function bubu(obj) {

  for (let key in obj) {
    let val = obj[key];    
    
    if (val instanceof Object) { // (!) Массивы и функции тоже пройдут такую проверку
                                 // надо ли их отсеить?
      let any_no_null = bubu(val);
      if (any_no_null) return true;
      
      // Если функция вернет сюда false, еще не нужно ничего возвращать.
      // Находимся в цикле, еще могут быть объекты, которые вернут true.
      
    } else if (val !== null) {
      // Нашел не-null значение, которое не является объектом, можно прервать цикл
      return true;
    }
  }
  
  return false; // Только когда всё прочесал, вернет false
}

Вообще-то массивы не нужно перебирать через for...in, но трудно представить, где здесь такой перебор может привести к ошибке. Если что, можно добавить дополнительную проверку if (val instanceof Array)

→ Ссылка