我有一个巨大的.json文件(约20000行),该文件是从.aml文件(基于XML的标记)转换而来的。 我可以按键或值找到key:value对,但找不到“ 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
有了这些信息,我可以浏览更高层次的汽车,例如汽车
在此示例中,我可以仅将路径保存在第二个“ if”关系中。但是在我的大文件中,如果算法过深,我还需要删除一些路径注释,并且需要再次进入更高的级别才能继续搜索。至少那是我的主意。
是否有任何命令或软件包可以这样做,或者我需要保存搜索钥匙的路线?
这是我的第一篇文章,我也向Hints开放如何改进在这里提出问题的方式:)
答案 0 :(得分:1)
要获取路径,请让您的递归函数返回一个数组,并在每次递归调用成功时在其前添加键:
bin
答案 1 :(得分:1)
您可以收集嵌套的键并返回找到的路径的数组。
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'));