【问题标题】:Get path to JSON object by key?按键获取 JSON 对象的路径?
【发布时间】:2021-05-31 07:29:12
【问题描述】:

给定以下对象:

const ourObject = {
    "payload": {
        "streams": [
            {
                "children": {
                    "2165d20a-6276-468f-a02f-1abd65cad618": {
                        "additionalInformation": {
                            "narrative": {
                                "apple": "A",
                                "banana": "B"
                            },
                            "myInventory": {
                                "fruits": [
                                    {
                                        "name": "apple"
                                    },
                                    {
                                        "name": "banana"
                                    }
                                ]
                            }
                        }
                    }
                }
            }
        ]
    }
};

我们正在寻找myInventory的路径,问题是孩子的uuid每次都会不同。知道如何通过提供myInventory 的路径作为键并获取它的 json 路径吗?

【问题讨论】:

  • streams 是一个数组,它总是只有一个元素吗? children 里面是否只有一个键?

标签: javascript arrays json lodash


【解决方案1】:

如果事情是动态的,程序化的关键搜索可能会有所帮助

const ourObject = {
    "payload": {
        "streams": [
            {
                "children": {
                    "2165d20a-6276-468f-a02f-1abd65cad618": {
                        "additionalInformation": {
                            "narrative": {
                                "apple": "A",
                                "banana": "B"
                            },
                            "myInventory": {
                                "fruits": [
                                    {
                                        "name": "apple"
                                    },
                                    {
                                        "name": "banana"
                                    }
                                ]
                            }
                        }
                    }
                }
            }
        ]
    }
};

const getPath = (key, o) => {
  if (!o || typeof o !== "object") {
    return "";
  }

  const keys = Object.keys(o);
  for(let i = 0; i < keys.length; i++) {
    if (keys[i] === key ) {
      return key;
    }
    
    const path = getPath(key, o[keys[i]]);
    if (path) {
      return keys[i] + "." + path;
    }
  }
  return "";
};

const getValueForKey = (key, o) => {
  if (!o || typeof o !== "object") {
    return undefined;
  }

  const keys = Object.keys(o);
  for(let i = 0; i < keys.length; i++) {
    if (keys[i] === key ) {
      return o[key];
    }
    
    const value = getValueForKey(key, o[keys[i]]);
    if (value) {
      return value;
    }
  }
  return undefined;
}

console.log(getPath("myInventory", ourObject))
console.log(getValueForKey("myInventory", ourObject))

【讨论】:

    【解决方案2】:

    不确定我是否理解正确,但是

    let uuid = '2165d20a-6276-468f-a02f-1abd65cad618';
    ourObject.payload.streams[0].children[uuid].additionalInformation.myInventory
    

    【讨论】:

    • 问题是每次都不会知道 uuid,所以我们如何仅根据密钥访问 myInventory。例如使用通配符不起作用:ourObject.payload.streams[0].children[*].additionalInformation.myInventory
    【解决方案3】:
    var changingKey = Object.keys(ourObject["payload"]["streams"][0]["children"])[0]; 
    
    console.log(ourObject["payload"]["streams"][0]["children"][changingKey]["additionalInformation"]["myInventory"]);
    

    【讨论】:

      【解决方案4】:

      好的,您可以创建一个获取 UUID 的辅助函数。由于它是一个对象,因此查找接近 O(1),尤其是考虑到孩子们在这里只有一个键值对的情况。

      function getUUIDFromPayload(payload) {
          let obj = payload.streams[0].children
          let uuid = Object.keys(obj)[0]
          return uuid
      }
      

      用法

      const uuid = getUUIDFromPayload(payload)
      ourObject.payload.streams[0].children[uuid].additionalInformation.myInventory
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-10-12
        • 1970-01-01
        • 1970-01-01
        • 2021-11-27
        • 2013-12-03
        • 1970-01-01
        • 2014-10-13
        相关资源
        最近更新 更多