让我详细解释一下。我跟下了一个对象 -
{
"OBJECT1" : {
"NAME1" : "VALUE1",
"NAME2" : "VALUE2",
"NAME3" : "VALUE3"
},
"OBJECT2" : {
"NAME4" : "VALUE4",
"NAME5" : "VALUE5"
}
}
从这个对象,我想获得像OBJECT1 = 3中的元素数量和OBJECT2中的元素数量= 2的东西。如果可以的话,可以使用javascript。 基本上我要做的是,动态地遍历对象中可用的名称值对,这样如果有人向对象添加了另一个元素,我就不必更改我的代码了。
此外,还排除了任何替代方案,因为我只允许在我的用例中使用对象。
答案 0 :(得分:9)
如果不转换对象,您可以迭代遍历对象计数属性,如下所示:
function countObjectProperties(obj)
{
var count = 0;
for(var i in obj)
if(obj.hasOwnProperty(i))
count++;
return count;
}
根据我在下面的评论中所说的扩展您需要使用hasOwnProperty的原因,您可能会遇到一个问题,其中库或浏览器已向Objects添加了方法和属性,以避免计算这些我们检查在计算它之前hasOwnProperty。 More details at MSDN或Mozilla Developer Center
答案 1 :(得分:4)
对于表示对象的JSON字符串(这是您的情况),您不能使用任何长度属性。你需要在对象中循环(参见Kristoffer S Hansen的回答)。
如果它代表数组,您可以使用以下内容获取长度:
var len = arr.length;
JQuery使其变得更简单:
var len = $(JSON).length;
答案 2 :(得分:1)
按照问题中的说明回答更广泛的目标:
要循环浏览属性,可以使用for..in结构:
for (var item in myobject) {
// some browsers add more properties to every object, we don't want those
if (myobject.hasOwnProperty(item)) {
do_something(item);
}
}
假设myobject
是您问题中的对象,则会循环显示该对象并调用do_something(OBJECT1)
和do_something(OBJECT2)
;您可以使用相同的构造来遍历子对象:
// loop through OBJECT1 and OBJECT2
for (var item in myobject) {
// some browsers add more properties to every object, we don't want those
if (myobject.hasOwnProperty(item)) {
// loop through the item's children
for (var pair in item) {
if (item.hasOwnProperty(pair)) {
// each of the name:value pairs will be passed to this
do_something_else(item,pair);
}
}
}
}