数组长度不起作用

Tud*_*oiu 1 javascript multidimensional-array

可能重复:
数组长度未定义

我有以下数组,但每当我试图找出它的长度categoryData.length只给我undefined.如果我输入console.log(categoryData)它会给我数组中的所有对象.

var categoryData = {
animals: {
    name: "Animals",
    description: "All your favorites from aardvarks to zebras.",
    items: [
        {
            name: "Pets"
        },
        {
            name: "Farm Animals"
        },
        {
            name: "Wild Animals"
        }
    ]
},
colors: {
    name: "Colors",
    description: "Fresh colors from the magic rainbow.",
    items: [
        {
            name: "Blue"
        },
        {
            name: "Green"
        },
        {
            name: "Orange"
        },
        {
            name: "Purple"
        },
        {
            name: "Red"
        },
        {
            name: "Yellow"
        },
        {
            name: "Violet"
        }
    ]
},
vehicles: {
    name: "Vehicles",
    description: "Everything from cars to planes.",
    items: [
        {
            name: "Cars"
        },
        {
            name: "Planes"
        },
        {
            name: "Construction"
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

};

rai*_*7ow 9

那是因为categoryData不是一个数组 - 它是一个对象.虽然一些JS对象(arguments例如)支持length属性,但使用对象文字表示法创建的对象则不支持.

您可以自己计算对象的长度,使用:

function countProps(obj) {
    var count = 0;
    for (var p in obj) {
      obj.hasOwnProperty(p) && count++;
    }
    return count; 
}
Run Code Online (Sandbox Code Playgroud)

如果您的目标环境支持(或已经填充)方法,即使以更简单的方式也可以这样做Object.keys:

function sizeObj(obj) {
  return Object.keys(obj).length;
}
Run Code Online (Sandbox Code Playgroud)

......这正是Underscore.js库方法的完成方式:

_.size = function(obj) {
    if (obj == null) return 0;
    return (obj.length === +obj.length) ? obj.length : _.keys(obj).length;
};
Run Code Online (Sandbox Code Playgroud)