获取当前 JSON 节点的完全限定名称
Get fully qualified name of current JSON node
给定一个Javascript对象,如何遍历每个属性并获取每个节点的完全限定名称? 我正在尝试这样的事情:
var test = {
"axes" : [{
"stackType": "100%",
"testObject": {
"testProperty": "found"
},
"minimum": 0
}, {
"gridColor": "#test",
"testArray": [
{"jelly": 2}, {"jam": 3}
],
"gridAlpha": 1
}]
};
iterate(test);
function iterate(obj, parents) {
if(!parents) { var parents = []; }
for (var property in obj) {
parents.push(property);
if (obj.hasOwnProperty(property)) {
if (typeof obj[property] == "object") {
iterate(obj[property], parents);
}
else if (obj[property].constructor == Array) {
for (var i = 0; i < obj[property].length; i++) {
iterate(obj[property][i], parents);
}
}
else {
console.log(parents + " : " + obj[property]);
}
}
}
}
但是父数组只是不断被添加到。 我认为这是因为 Javascript 通过引用而不是按值处理数组。
我想要的输出是这样的:
axes, 0, stackType : 100%
axes, 0, testObject, testProperty : found
axes, 0, minimum : 0
axes, 1, gridColor: #test
axes, 1, testArray, 0, jelly: 2
axes, 1, testArray, 1, jam: 3
axes, 1, gridAlpha: 1
但相反,我只是添加了每个新属性,并且列表永远不会重置。
在循环中,您需要创建传入数组的副本parents
并将property
附加到该数组中,并在递归调用中传递该副本。否则,您只是在修改同一个数组。
var test = {
"axes": [{
"stackType": "100%",
"testObject": {
"testProperty": "found"
},
"minimum": 0
}, {
"gridColor": "#test",
"testArray": [{
"jelly": 2
}, {
"jam": 3
}],
"gridAlpha": 1
}]
};
iterate(test);
function iterate(obj, parents) {
if (!parents) {
var parents = [];
}
for (var property in obj) {
// changed line:
var path = [].concat(parents, property);
if (obj.hasOwnProperty(property)) {
if (typeof obj[property] == "object") {
iterate(obj[property], path); // changed
} else if (obj[property].constructor == Array) {
for (var i = 0; i < obj[property].length; i++) {
iterate(obj[property][i], path); // changed
}
} else {
// changed so you can see it without opening the console
logLine(path.join(', ') + " : " + obj[property]);
}
}
}
}
function logLine(line) {
// show in console and in HTML
console.log(line);
document.getElementById('output').textContent += line + ''n';
}
<pre id="output"></pre>
相关文章:
- 节点fs.stat名称未定义
- 如何在动态创建的节点上绑定函数
- 有没有比在app.js上绑定模块名称更好的方法来动态加载视图模型和视图以显示模态
- d3使用链接的节点名称的力图
- 如何在没有jQuery的情况下模拟按名称命名的事件或解除单个事件的绑定
- AlloyUI图表生成器:按ID而不是名称连接节点
- 隔离作用域+绑定名称和仅在AngularJS中的隔离作用域之间的差异
- 为什么获胜't这个函数给我元素的名称it's绑定到
- 取消绑定父节点和子节点
- 如何根据我正在读取的节点的元素名称创建元素
- 如果数据绑定对象只有它的名称,那么敲除如何知道它
- 如何设置浏览器选项卡's锚定目标名称
- 在jQuery中选择一个具有名称空间的节点
- 用Javascript更改Kendo TreeView节点名称-我不'I don’我不知道怎么做
- 浏览元素的节点'JavaScript中的名称
- 如何使用 angularjs 中的表达式绑定属性名称
- 在属性名称中搜索带有冒号的 xpath 表达式会引发异常(节点.js元素树模块)
- 如何通过绑定名称加载类受限的 Angular 指令
- 在角树控件中将数据从父作用域绑定到节点中的元素
- 如何使用jQuery从视图模型中获取绑定根节点.blockUI上它,而AJAX张贴