Javascript/JSON获取给定子节点的路径?
如何获得对象的给定子节点的JSON路径 例如: 给出了一个参考键4的变量。现在我在寻找绝对路径: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
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