【问题标题】:JavaScript nested properties [duplicate]JavaScript嵌套属性[重复]
【发布时间】:2023-03-09 03:52:01
【问题描述】:

如果我有一个具有嵌套属性的对象。是否有一个函数可以搜索所有属性,以及具有其他对象(也有自己的属性)值的属性等等?

示例对象:

const user = { 
    id: 101, 
    email: 'help@stack.com', 
    info: { 
        name: 'Please', 
        address: {
            state: 'WX' 
        }
    }
}

在上面的对象中,我可以简单地调用类似的方法

console.log(findProp(user, 'state'));
console.log(findProp(user, 'id'));

【问题讨论】:

  • 您可以考虑使用类似于此问题中描述的内容:Accessing nested JavaScript objects with string key
  • 我想这个可能会回答你的问题:How to get the key value from nested object
  • @MikeMcCaughan 那篇文章的问题在于,所有答案都提供了直接位置。而不是简单地在对象中的任何位置请求它,而不管有多少层。
  • @MikeMcCaughan 第二篇文章正是我想要的。非常感谢。
  • @PatrickRoberts 那篇文章更好,因为我正在使用它来查找独特的属性,因此不需要将它放在数组中

标签: javascript object nested-properties


【解决方案1】:

您需要的是一个递归函数,它可以查找匹配键的嵌套项(对象和数组)(我还为查找添加了一个数组):

var user = { id: 101, email: 'help@stack.com', info: {name: 'Please', address: {state: 'WX' }, contacts: [{'phone': '00000000'}, {'email': 'aaa@bbb.ccc'}]}}

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 防止迭代或检索内置属性。

【讨论】:

    【解决方案2】:
     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;
         }
       }
    }
    

    【讨论】:

    • 您可能需要添加检查以确保obj[key] 不是null,否则在下一次递归尝试检查key in obj 时将引发异常。
    • @CRice 对,谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-09
    • 1970-01-01
    • 1970-01-01
    • 2020-11-03
    • 1970-01-01
    • 1970-01-01
    • 2016-02-27
    相关资源
    最近更新 更多