4

重複の可能性:
配列の長さが定義されていません

私は次の配列を持っていますが、それで長さを調べようとするとcategoryData.lengthundefined. 入力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"
        }
    ]
}

};

4

1 に答える 1

15

これは、categoryDataが配列ではなく、オブジェクトであるためです。また、一部のJSオブジェクト(argumentsたとえば)はlengthプロパティをサポートしていますが、オブジェクトリテラル表記で作成されたオブジェクトはサポートしていません。

これにより、オブジェクトの長さを自分で数えることができます。

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

これは、ターゲット環境が次の方法をサポートしている(またはシムしている)場合は、より簡単な方法でも実行できますObject.keys

function sizeObj(obj) {
  return Object.keys(obj).length;
}

...そしてそれはまさにUnderscore.jsライブラリメソッドで行われている方法です:

_.size = function(obj) {
    if (obj == null) return 0;
    return (obj.length === +obj.length) ? obj.length : _.keys(obj).length;
};
于 2012-11-24T14:08:06.090 に答える