Javascript 从对象递归获取匹配键的值

Javascript 从对象递归获取匹配键的值,javascript,Javascript,我有这个json对象 { "data": { "user": { "user_info": { "id": "AoGC2HQ9vedHmzcMX" }, "product": [ { "node": { "id":

我有这个json对象

{
  "data": {
    "user": {
      "user_info": {
        "id": "AoGC2HQ9vedHmzcMX"
      },
      "product": [
        {
          "node": {
            "id": "NzcxNzU2ODU1ODM1",
            "feedback": {
              "raters": {
                "nodes": [
                  {
                    "id": "1",
                    "name": "Dan"
                  },
                  {
                    "id": "2",
                    "name": "Allen"
                  },
                  {
                    "id": "3",
                    "name": "Williams"
                  }
                ]
              },
              "commentors": {
                "nodes": [
                  {
                    "id": "001",
                    "name": "Kent"
                  },
                  {
                    "id": "002",
                    "name": "Jay"
                  }
                ]
              }
            }
          }
        }
      ]
    }
  }
}
那么,如果父属性与所需的键名匹配,如何获取
id
的值呢?在本例中,我只想从
raters.nodes
获取所有id

所以预期的结果是

[1,2,3]
我知道可以执行
obj.data.user.product[0].node.feedback.raters.nodes
并循环执行,但这不是我想要的方式,对象树偶尔也会更改

我使用了这个递归函数

const recursiveSearch = (obj, searchKey, results = []) => {
   const r = results;
   Object.keys(obj).forEach(key => {
      const value = obj[key];
      if(key === searchKey && typeof value !== 'object'){
         r.push(value);
      }else if(typeof value === 'object'){
         recursiveSearch(value, searchKey, r);
      }
   });
   return r;
};

//returns all id's

当它工作时,它会返回所有id值,那么如何改进它呢?如果没有,我如何才能做到这一点呢?

我想你真的想分两步做到这一点

首先创建一个函数来获取您要查找的根节点,然后您可以像普通一样使用map

下面是一个例子

目前,代码>var数据=JSON.代码>var数据=JSON.代码代码代码>数据数据=目前的数据数据=目前的数据。目前的数据数据=JSON.数据=目前的数据数据=JSON.数据=目前的数据=JSON。解析方方将以该名数据为准。目前的数据:::“{”数据用户::“\\\\用户”用户:“\ \ \“id”id\::“中国政府GC2HQQQQQQQQQ9ved准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准准“}]},\'commentors\':{\'nodes\':[{\'id\':\'001\',\'name\':\'Kent\'},{\'id\':\'002\',\'name\':\'Jay\'}]}}}}}); 函数getRoot(数据,搜索){ 函数get(路径、数据){ for(对象条目的常数[k,v](数据)){ if(v instanceof对象){ 常量pp=`${path}.${k}`; if(pp.slice(-search.length)==search){ 返回v; } 常量r=get(`${path}.${k}`,v); if(r)返回r; } } } 返回get(“”,数据); } const r=getRoot(数据“raters.nodes”);
log(r&&r.map(i=>i.id))我明白了,如果有多个raters.node怎么办?