首页 > 解决方案 > 如何获取 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”关系中。但是在我的大文件中,如果算法太深,我还需要删除一些路径注释,并且需要再次进入更高级别以继续搜索。至少那是我的想法。

是否有任何命令或软件包可以这样做,或者我是否需要保存搜索密钥的路线?

这是我的第一篇文章,我也愿意提示如何改进这里的提问方式:)

标签: javascriptarraysjson

解决方案


您可以收集嵌套键并返回找到的路径数组。

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


推荐阅读