我有一个嵌套对象,如:
var nested = {
k: 1,
j: {
i: 1,
k: 0
},
o: function(a, bc) {},
p: {
k: 0,
p: {
py: 0,
kg: 8
}
}
}
我尝试循环它并从0 to n
的每个属性生成唯一标识符,其中n
是var nested
对象的属性总数。鉴于上述var nested
,我希望如下:
var nested = {
k: 1, -> (0)
j: { -> (1)
i: 1, -> (2)
k: 0 -> (3)
},
o: function(a, bc) {}, -> (4)
p: { -> (5)
k: 0, -> (6)
p: { -> (7)
py: 0, -> (8)
kg: 8 -> (9)
}
}
}
如果更简单,那么我想计算(嵌套)对象有多少属性和console.log每个属性及其索引。我将使用代码原型更新问题
答案 0 :(得分:1)
您可以将属性视为属性树。 root是嵌套的 root:嵌套 2级:(K,J,O,P) ..... 然后您可以使用pre-order来移动此属性树。
您可以使用
访问这些属性答案 1 :(得分:1)
这是一种迭代嵌套对象/数组的方法。您可以将传递给回调的生成路径用作唯一标识符,也可以在回调时迭代回调中的计数器,或者输入您想要的任何类型的标识符。
function iterateProperties(obj, fn, path) {
var newPath, prop, i;
path = path || "top";
if (Array.isArray(obj)) {
for (var i = 0; i < obj.length; i++) {
newPath = path + "[" + i + "]";
fn(newPath, obj[i]);
if (typeof obj[i] === "object") {
iterateProperties(obj[i], fn, newPath);
}
}
} else {
path += ".";
for (prop in obj) {
if (obj.hasOwnProperty(prop)) {
newPath = path + prop;
fn(newPath, obj[prop]);
if (typeof obj[prop] === "object") {
iterateProperties(obj[prop], fn, newPath);
}
}
}
}
}
var nested = {
k: 1,
j: {
i: 1,
k: 0
},
o: function(a, bc) {},
p: {
k: 0,
p: {
py: 0,
kg: 8
}
}
}
iterateProperties(nested, function(path, val) {
log(path, " = ", val);
}, "nested");
<script src="http://files.the-friend-family.com/log.js"></script>
传递给此函数的对象的一个要求是它不能具有循环obj引用。