我正在寻找解析JSON树的替代方法。给出以下示例:
{
"firstName": "John",
"lastName" : "doe",
"age" : 26,
"address" : {
"streetAddress": "naist street",
"city" : "Nara",
"postalCode" : "630-0192"
}
}
如果我试图访问分支,如address.streetAddress
或address.city
然后我可以看到获得该值的方法有两种:
1)上面列出的查询的JSON路径
2)手动将查询拆分为“分支”(主分支地址,子分支streetAddress),然后以这种方式检查对象键。
有更好的方法吗?更好的是,我指的是高效的代码,不一定是“干净的”代码。
所述代码的应用将是在NGRX metareducer中使用此代码来自动将对象保存到本地存储,因此它可能会经常评估一棵大树。
谢谢。
经过各种方法的测试后,我最终选择了_ug的答案。
下面的数据,以及我使用的脚本的要点(没有数据,这是敏感的)。我在4个查询中对每个函数运行了100万次。
Executing test: empty test
Average time for 1,000,000 executions: 6.181699991226196 milliseconds.
Executing test: split and reduce
Average time for 1,000,000 executions: 429.71359902620316 milliseconds.
Executing test: lodash
Average time for 1,000,000 executions: 1091.8809990286827 milliseconds.
Executing test: json path
Average time for 1,000,000 executions: 32114.680999994278 milliseconds.
巧合的是为此写了一些东西,它不适用于数组,但是非常简单。
let obj = {
"firstName": "John",
"lastName" : "doe",
"age" : 26,
"address" : {
"streetAddress": "naist street",
"city" : "Nara",
"postalCode" : "630-0192"
}
}
function jsonPath(path, obj) {
return path.split('.').reduce((o, p) => o[p], obj);
}
console.log(jsonPath('address.streetAddress', obj));
console.log(jsonPath('address.city', obj));
您也可以通过将split更改为括号来使其适应于数组运行 split(/[\[\.\]]+/)
您也可以通过将reduce更改为,使它返回未定义状态,而不是在找不到路径值时抛出错误。 reduce((o, p) => o && o[p], obj)
结果将是:
let obj = {
"firstName": "John",
"lastName" : "doe",
"age" : 26,
"addresses" : [{
"streetAddress": "naist street",
"city" : "Nara",
"postalCode" : "630-0192"
}]
}
function jsonPath(path, obj) {
return path.split(/[\[\.\]]+/).reduce((o, p) => o && o[p], obj);
}
console.log(jsonPath('addresses[0].streetAddress', obj));
console.log(jsonPath('addresses[0].city', obj));
console.log(jsonPath('addresses[2].city', obj));
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句