javascript - 如何获取 JSON 键的路径:值对
问题描述
我有一个巨大的(约 20000 行).json 文件,它是从 .aml 文件(基于 XML 的标记)转换而来的。我可以通过键或值找到键:值对,但我找不到它在哪里像“Document[0].Level[3][2].Sub[2]”
目标是将 .json 文件转换为不同的文件,部分可用于 JSON-LD,我需要汇总或移动并声明原始 .json 的一些条目
例如在以下 JSON 中:
myObj = {
"name": "John",
"age": 30,
"cars": {
"garage1": [{
"Car1": "Ford",
"Car2": "Seat"
}],
"garage2": [{
"car2": "BMW",
"car3": "Fiat"
}]
}
}
我使用以下代码来查找该对:
function getKeys(obj, val) {
var objects = [];
for (var i in obj) {
if (!obj.hasOwnProperty(i)) continue;
if (typeof obj[i] == 'object') {
objects = objects.concat(getKeys(obj[i], val));
} else if (obj[i] == val) {
// objects.push(i);
objects.push(obj);
}
}
return objects;
}
与
result = getKeys(myObj,'Ford');
我得到:
[ { Car1: 'Ford', Car2: 'Seat' } ]
问题是,我不知道这是哪里,而且如果有的话,我也无法查看第二个车库里有什么。
我还想收到路径信息,例如:
cars.garage1
有了这些信息,我可以从更高的层次上看,例如 Cars
在这个例子中,我可以将路径保存在我的第二个“if”关系中。但是在我的大文件中,如果算法太深,我还需要删除一些路径注释,并且需要再次进入更高级别以继续搜索。至少那是我的想法。
是否有任何命令或软件包可以这样做,或者我是否需要保存搜索密钥的路线?
这是我的第一篇文章,我也愿意提示如何改进这里的提问方式:)
解决方案
您可以收集嵌套键并返回找到的路径数组。
function getPath(object, value) {
return Object
.keys(object)
.reduce((r, k) => {
var kk = Array.isArray(object) ? `[${k}]` : `${k}`;
if (object[k] === value) {
r.push(kk);
}
if (object[k] && typeof object[k] === 'object') {
r.push(...getPath(object[k], value).map(p => kk + (p[0] === '[' ? '' : '.') + p));
}
return r;
}, []);
}
var object = { name: "Ford", age: 30, cars: { garage1: [{ Car1: "Ford", Car2: "Seat" }], garage2: [{ car2: "BMW", car3: "Fiat" }] } };
console.log(getPath(object, 'Ford'));
推荐阅读
- ruby-on-rails - Ruby Rescue 异常未触发
- java - JProfiler - "Run GC" button vs Heap Snapshot's "Perform full GC in heap snapshot" option
- python - How to make instances spawn automatically around the player?
- knockout.js - KnockoutJS 如何创建更干净、更短的嵌套循环?
- apache-nifi - How to accumulate several API call responses in Apache Nifi?
- python - Define number of uses in a decorator (Singleton pattern with decorators)
- r - 根据常见日期创建组变量
- javascript - Create a mousemove event for a canvas library
- python - 我的单元测试中可以包含哪些额外的测试用例?
- java - 如何知道占用了哪些端口?