按键获取 JSON object 的路径?

Get path to JSON object by key?

给出以下 object:

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

我们试图找到 myInventory 的路径,问题是 children 的 uuid 每次都会不同。知道我们如何通过将它作为密钥提供并获得 json 路径来获得 myInventory 的路径吗?

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

let uuid = '2165d20a-6276-468f-a02f-1abd65cad618';
ourObject.payload.streams[0].children[uuid].additionalInformation.myInventory
var changingKey = Object.keys(ourObject["payload"]["streams"][0]["children"])[0]; 

console.log(ourObject["payload"]["streams"][0]["children"][changingKey]["additionalInformation"]["myInventory"]);

如果情况是动态的,程序化密钥搜索可能会有所帮助

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))

好的,您可以创建一个获取 UUID 的辅助函数。因为它是一个 object,查找接近于 O(1),特别是考虑到 children 这里只有一对 key-value 的情况。

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