遍历JavaScript对象 - 我错过了什么?

时间:2011-10-20 15:10:27

标签: javascript object traversal

这是一个非常简单的问题,但我无法弄清楚我做错了什么。说我有这个对象:

features: {
    savings: {
        link: "test.html",
        img: "/_assets/img/related-content/sample.png"
    },
    security: {
        link: "test2.html",
        img: "/_assets/img/related-content/sample2.png"
    },
    speed: {
        link: "test3.html",
        img: "/_assets/img/related-content/sample3.png"
    }
}

假设此格式已设置且无法更改。我可以通过features["savings"].link这样的方式轻松选择。但是,假设我想从这个对象中获取一个随机项。我会生成一个随机数,然后使用它选择索引。但是features[randnum].link不起作用。为什么是这样?如何在不修改对象格式的情况下执行此操作?

谢谢!

3 个答案:

答案 0 :(得分:3)

这是因为你正在处理一个对象,而不是一个数组,所以你不能只用一个数字索引对象。你必须做类似的事情:

var randnum = getRandomNumber(1, 3); // get random num between 1 and 3
var randomLink = features["feature" + randnum].link;

只是为了澄清,这个符号:

features["feature1"].link;

相同
features.feature1.link;

如果您没有可以轻松生成的属性名称,例如“security”或“savings”,则可以使用数组来帮助您,假设属性是静态的。

var properties = [ "security", "savings" ];
var randomProperty = properties[Math.floor(Math.random() * properties.length)];
var randomLink = features[randomProperty].link;

如果你不知道你的属性是什么,那么你可以收集它们:

var properties = [];
for (var prop in features) {
    if (features.hasOwnProperty(prop)) {
        properties.push(prop);
    }
}
var randomProperty = properties[Math.floor(Math.random() * properties.length)];
var randomLink = features[randomProperty].link;

答案 1 :(得分:0)

js对象不是数字索引,不能使用整数作为数组访问它。

答案 2 :(得分:0)

针对原始json结构的[某些]功能将使其寻找features.something。但是,您实际上可以使功能成为json对象的数组。这将为您提供您想要的随机访问权限。但是,除非您考虑创建数组,否则它将成为查找feature3的“搜索”功能。

for features [randomInteger] .link,切换到下面的结构:

var features = [{
        name:"feature1",
        link: "test.html",
        img: "/_assets/img/related-content/sample.png"
    },
    {
        name:"feature2",
        link: "test2.html",
        img: "/_assets/img/related-content/sample2.png"
    },
    {
        name:"feature3",
        link: "test3.html",
        img: "/_assets/img/related-content/sample3.png"
    }]