我有一个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.
我认为递归函数可以帮到你(更新版本,检查值)
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)
以下内容查找任何级别的嵌套对象中的路径。也有数组。它返回找到的所有路径,如果您有同名的键,这就是您想要的。
我喜欢这种方法,因为它适用于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为字符串,如果已定义,则返回该函数。