簡體   English   中英

從 object 遞歸獲取匹配鍵的值

[英]Get values for a matching key recursively from object

我有這個 json object

{
  "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並循環執行,但這不是我想要的,object 樹偶爾會發生變化。

我用過這個遞歸 function

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 值,那么我該如何改進它呢? 如果沒有,我該如何做到這一點?

我想你真的想分兩步做到這一點,..

首先制作一個 function 來獲取您要查找的根節點,然后您可以像往常一樣使用 map。

下面是一個例子。

 var data = JSON.parse("{\"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\"}]}}}}]}}}"); function getRoot(data, search) { function get(path, data) { for (const [k, v] of Object.entries(data)) { if (v instanceof Object) { const pp = `${path}.${k}`; if (pp.slice(-search.length) === search) { return v; } const r = get(`${path}.${k}`, v); if (r) return r; } } } return get('', data); } const r = getRoot(data, 'raters.nodes'); console.log(r && r.map(i => i.id));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM