如何获取JSON key:value对的路径

时间:2019-01-28 12:21:18

标签: javascript arrays json

我有一个巨大的.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开放如何改进在这里提出问题的方式:)

2 个答案:

答案 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'));