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)
