Вложенные свойства JavaScript [дубликаты]

1

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

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

const user = { 
    id: 101, 
    email: '[email protected]', 
    info: { 
        name: 'Please', 
        address: {
            state: 'WX' 
        }
    }
}

В объекте выше есть способ, которым я мог бы просто называть что-то вроде

console.log(findProp(user, 'state'));
console.log(findProp(user, 'id'));
  • 0
    Возможно, вы захотите использовать что-то вроде того, что описано в этом вопросе: Доступ к вложенным объектам JavaScript с помощью строкового ключа
  • 0
    Я думаю, что этот может ответить на ваш вопрос, хотя: Как получить значение ключа из вложенного объекта
Показать ещё 3 комментария
Теги:
object

2 ответа

1
Лучший ответ

Вам нужна рекурсивная функция, которая ищет вложенные элементы (объект и массив) для соответствующего ключа (я также добавил массив для поиска):

var user = { id: 101, email: '[email protected]', info: {name: 'Please', address: {state: 'WX' }, contacts: [{'phone': '00000000'}, {'email': '[email protected]'}]}}

function keyFinder(object, key) {
  if(object.hasOwnProperty(key)) return object[key];
  for(let subkey in object) {
    if(!object.hasOwnProperty(subkey) || typeof object[subkey] !== "object") continue;
    let match = keyFinder(object[subkey], key);
    if(match) return match;
  }
  return null;
}

console.log('id', keyFinder(user, 'id'));
console.log('state', keyFinder(user, 'state'));
console.log('phone', keyFinder(user, 'phone'));
console.log('notexisting', keyFinder(user, 'notexisting'));

Object.hasOwnProperty защищает от повторения или получения встроенных свойств.

0
 function findProp(obj, search) {
   if(key in obj) return obj[key];
   for(const key in obj) {
     if(typeof obj[key] === "object" && obj[key] !== null) {
       const res = findProp(obj[key], search);
       if(res) return res;
     }
   }
}
  • 1
    Возможно, вы захотите добавить проверку, чтобы убедиться, что obj[key] не равен null , иначе будет выдано исключение при попытке проверить key in obj при следующей рекурсии.
  • 0
    @ Правильно, спасибо.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню