Javascript/JSON获取给定子节点的路径?

Javascript/JSON获取给定子节点的路径?,javascript,json,xpath,Javascript,Json,Xpath,如何获得对象的给定子节点的JSON路径 例如: 给出了一个参考键4的变量。现在我在寻找绝对路径: data.key1.children.key4 有没有办法在JS中完成这项工作 提前谢谢。那么您有一个值为“key3”的变量,您想知道如何基于此字符串的值动态访问此属性吗 var str = "key3"; data["key1"]["children"][str]; 编辑 哇,我不敢相信我第一次就得到了这个。其中可能有一些bug,但它适用于您的测试用例 我就是这样做的 /** * Conv

如何获得对象的给定子节点的JSON路径

例如:

给出了一个参考键4的变量。现在我在寻找绝对路径:

data.key1.children.key4
有没有办法在JS中完成这项工作


提前谢谢。

那么您有一个值为“key3”的变量,您想知道如何基于此字符串的值动态访问此属性吗

var str = "key3";
data["key1"]["children"][str];
编辑

哇,我不敢相信我第一次就得到了这个。其中可能有一些bug,但它适用于您的测试用例


我就是这样做的

/**
 * Converts a string path to a value that is existing in a json object.
 * 
 * @param {Object} jsonData Json data to use for searching the value.
 * @param {Object} path the path to use to find the value.
 * @returns {valueOfThePath|undefined}
 */
function jsonPathToValue(jsonData, path) {
    if (!(jsonData instanceof Object) || typeof (path) === "undefined") {
        throw "Not valid argument:jsonData:" + jsonData + ", path:" + path;
    }
    path = path.replace(/\[(\w+)\]/g, '.$1'); // convert indexes to properties
    path = path.replace(/^\./, ''); // strip a leading dot
    var pathArray = path.split('.');
    for (var i = 0, n = pathArray.length; i < n; ++i) {
        var key = pathArray[i];
        if (key in jsonData) {
            if (jsonData[key] !== null) {
                jsonData = jsonData[key];
            } else {
                return null;
            }
        } else {
            return key;
        }
    }
    return jsonData;
}  
希望这能帮助别人。

var数据={
//你的数据在这里
a:{
b:{
c:{
d:“阿萨拉穆·阿拉尔·穆斯利明”
}
}
},
//你的功能在这里
take:函数(路径){
var temp=this;//获取对象的副本
if(!path)return temp;//如果path未定义或为空,则返回副本
路径=路径分割(“/”);
for(路径中的变量p){
如果(!path[p])continue;//表示“a/”=“a”
temp=temp[path[p]];//新数据是数据的子数据
如果(!temp)返回温度;
}
返回温度;
}
};

试试看


数据:{a:{b:{c:{d:“阿萨拉穆·阿拉尔·穆斯莱明”}}

代码:data.take(路径)

结果:
我的解决方案:

  • 基于给定参考的深度优先搜索
  • 使用递归
  • 处理数组
(可以使用此函数检索结果。)

var key4Ref={abc:123}
风险值数据={
关键1:{
儿童:{
键2:“值”,
键3:“值”,
key4:key4Ref
}, 
键5:“值”
}
}
//在对象“数据”中查找指向“ref”的路径。
常量路径=(参考,数据,路径=[])=>{
const found=data&&Object.entries(data.find)([k,v])=>{
if(v==ref)返回路径。推送(k)
if(typeof v==='object'){
常量tmp=pathTo(ref,v,[…path,k])
如果(tmp)返回路径=tmp
}
})
如果(找到)返回路径
}

console.log(pathTo(key4Ref,data).join('.')
Hi Adam,感谢您的回复。我正在寻找完整的路径。“key1”和“children”是未知的。我有一个对data.key1.children.key3的引用存储在一个变量中,需要知道如何到达那里。@user1138959-我不确定这是否可能。我的意思是,您可以对对象的每个成员进行递归搜索,但是如果您必须更新sameI更新了我的代码示例的值,那么仍然无法知道变量指向哪个成员。我在找一个对象,不是字符串值。我如何递归搜索每个成员并获得匹配子级的路径?@user1138959-正如lwburk提到的,只要确保您没有类似
的子级:{…key6:data.key1
-如果您的搜索变量指向字符串对象(如示例中所示),请不要这样做,除非您真的喜欢无限循环;)您将无法可靠地搜索该路径,因为(例如)
data.key1.children.key3==data.key4
也将是
true
,并且可能不是您试图实现的。感谢Yoshi,我已更新了代码示例。现在该引用指向另一个对象。
var x = data.key1.children.key4;

var path = "data";
function search(path, obj, target) {
    for (var k in obj) {
        if (obj.hasOwnProperty(k))
            if (obj[k] === target)
                return path + "['" + k + "']"
            else if (typeof obj[k] === "object") {
                var result = search(path + "['" + k + "']", obj[k], target);
                if (result)
                    return result;
            }
    }
    return false;
}

var path = search(path, data, x);
console.log(path); //data['key1']['children']['key4']
/**
 * Converts a string path to a value that is existing in a json object.
 * 
 * @param {Object} jsonData Json data to use for searching the value.
 * @param {Object} path the path to use to find the value.
 * @returns {valueOfThePath|undefined}
 */
function jsonPathToValue(jsonData, path) {
    if (!(jsonData instanceof Object) || typeof (path) === "undefined") {
        throw "Not valid argument:jsonData:" + jsonData + ", path:" + path;
    }
    path = path.replace(/\[(\w+)\]/g, '.$1'); // convert indexes to properties
    path = path.replace(/^\./, ''); // strip a leading dot
    var pathArray = path.split('.');
    for (var i = 0, n = pathArray.length; i < n; ++i) {
        var key = pathArray[i];
        if (key in jsonData) {
            if (jsonData[key] !== null) {
                jsonData = jsonData[key];
            } else {
                return null;
            }
        } else {
            return key;
        }
    }
    return jsonData;
}  
var obj = {d1:{d2:"a",d3:{d4:"b",d5:{d6:"c"}}}};
jsonPathToValue(obj, "d1.d2"); // a 
jsonPathToValue(obj, "d1.d3"); // {d4: "b", d5: Object}
jsonPathToValue(obj, "d1.d3.d4"); // b
jsonPathToValue(obj, "d1.d3.d5"); // {d6: "c"}
jsonPathToValue(obj, "d1.d3.d5.d6"); // c