gpt4 book ai didi

javascript - 如何获取对象中嵌套属性的键路径?

转载 作者:行者123 更新时间:2023-12-03 05:34:20 29 4
gpt4 key购买 nike

我使用的是 Firebase,其 update 函数允许使用以下语法进行多位置更新:

newData['users/abc/age'] = 23
newData['users/xyz/hair'] = 'blue'
firebase.database().ref().update(newData)

我正在开发一个实用函数,它将把深层嵌套的对象扁平化为像 newData 这样的对象。这涉及递归地迭代对象并在循环下降时跟踪键。

到目前为止,我已经有了这个(现在只是将路径层添加到数组中。一旦算法正确,我将简单地使用 .join('/')):

function getKeypaths(obj, paths = []) {

let keys = Object.keys(obj)

for (let i = 0; i < keys.length; i++) {
let propName = keys[i]

paths.push(propName)
if (typeof obj[propName] === "object" && typeof obj[propName] !== null) {
console.log("PUSHING PATH", propName, paths)
getKeypaths(obj[propName], paths)
} else {
console.log("val", obj[propName], paths)

}
}
}


let obj = {
a: {
b: {
c: {
d: 1
}
},
x: {
y: {
z: 2
}
}
}
}

getKeypaths(obj)

当我运行此命令时,console.log 输出如下所示:

PUSHING PATH a [ 'a' ]
PUSHING PATH b [ 'a', 'b' ]
PUSHING PATH c [ 'a', 'b', 'c' ]
val 1 [ 'a', 'b', 'c', 'd' ]
PUSHING PATH x [ 'a', 'b', 'c', 'd', 'x' ]
PUSHING PATH y [ 'a', 'b', 'c', 'd', 'x', 'y' ]
val 2 [ 'a', 'b', 'c', 'd', 'x', 'y', 'z' ]

正如您所看到的,当循环开始挖掘下一个非对象值时,它会保留前一个值的路径。输出的最后一行应为: val 2 [ 'a', 'x', 'y', 'z' ]

然后,当循环返回到上一个级别时,我尝试清除 path 数组:

function getKeypaths(obj, paths = []) {
let keys = Object.keys(obj)
for (let i = 0; i < keys.length; i++) {
let propName = keys[i]
if (propName) paths.push(propName)
if (typeof obj[propName] === "object" && typeof obj[propName] !== null) {
console.log("PUSHING PATH", propName, paths)
getKeypaths(obj[propName], paths)
paths.length = 0
} else {
console.log("val", obj[propName], paths)
}
}
}

getKeypaths(obj)

但这只会导致循环忘记第一个之后当前级别之前的路径:

PUSHING PATH a [ 'a' ]
PUSHING PATH b [ 'a', 'b' ]
PUSHING PATH c [ 'a', 'b', 'c' ]
val 1 [ 'a', 'b', 'c', 'd' ]
PUSHING PATH x [ 'x' ]
PUSHING PATH y [ 'x', 'y' ]
val 2 [ 'x', 'y', 'z' ]

有什么建议吗?如果有更直接的方法来做到这一点,请向帮助程序库开放。

最佳答案

您应该能够使用json-pointer做你想做的事。

该模块包含 dict返回包含 JSON 指针键及其关联值的对象的函数。例如:

var jsonPointer = require("json-pointer");

var data = {
users: {
abc: {
age: 23
},
xyz: {
hair: "blue"
}
}
};
var dict = jsonPointer.dict(data);

生成的字典将是:

{
"/users/abc/age": 23,
"/users/xyz/hair": "blue"
}

键/路径将以斜杠开头,但 Firebase 仍会将它们视为相对于调用 update 的引用。

关于javascript - 如何获取对象中嵌套属性的键路径?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40796284/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com