如何从key和value获取javascript对象的路径

Dim*_*iwa 6 javascript object

我有一个javascript对象宽度深度.

我需要知道对象ex中这个键的确切路径:"obj1.obj2.data1"

我已经知道密钥是data1,值是123.

我的javascript对象看起来像这样

{
    obj1: {
        obj2: {
            data1: 213,
            data2: "1231",
            obj3: {
                data: "milf"
            }
        }
    },
    obj4: {
        description: "toto"
    }
}
Run Code Online (Sandbox Code Playgroud)

我怎么能实现这一目标?

这是一个jsfiddle:http://jsfiddle.net/3hvav8xf/8/ 我正在尝试实现getPath.

Far*_*lko 6

我认为递归函数可以帮到你(更新版本,检查值)

function path(c, name, v, currentPath, t){
    var currentPath = currentPath || "root";

    for(var i in c){
      if(i == name && c[i] == v){
        t = currentPath;
      }
      else if(typeof c[i] == "object"){
        return path(c[i], name, v, currentPath + "." + i);
      }
    }

    return t + "." + name;
};

path({1: 2, s: 5, 2: {3: {2: {s: 1, p: 2}}}}, "s", 1)
Run Code Online (Sandbox Code Playgroud)


Rol*_*rov 5

以下内容查找任何级别的嵌套对象中的路径。也有数组。它返回找到的所有路径,如果您有同名的键,这就是您想要的。

我喜欢这种方法,因为它适用于lodash方法get并且set开箱即用。

function findPathsToKey(options) {
  let results = [];

  (function findKey({
    key,
    obj,
    pathToKey,
  }) {
    const oldPath = `${pathToKey ? pathToKey + "." : ""}`;
    if (obj.hasOwnProperty(key)) {
      results.push(`${oldPath}${key}`);
      return;
    }

    if (obj !== null && typeof obj === "object" && !Array.isArray(obj)) {
      for (const k in obj) {
        if (obj.hasOwnProperty(k)) {
          if (Array.isArray(obj[k])) {
            for (let j = 0; j < obj[k].length; j++) {
              findKey({
                obj: obj[k][j],
                key,
                pathToKey: `${oldPath}${k}[${j}]`,
              });
            }
          }

          if (obj[k] !== null && typeof obj[k] === "object") {
            findKey({
              obj: obj[k],
              key,
              pathToKey: `${oldPath}${k}`,
            });
          }
        }
      }
    }
  })(options);

  return results;
}

findPathsToKey({ obj: objWithDuplicates, key: "d" })
// ["parentKey.arr[0].c.d", "parentKey.arr[1].c.d", "parentKey.arr[2].c.d"]
Run Code Online (Sandbox Code Playgroud)

在这里试试 - https://jsfiddle.net/spuhb8v7/1/

如果您希望结果是单个键(第一次遇到),您可以将 更改results为字符串,如果已定义,则返回该函数。