通过对象内的索引访问数组

时间:2014-04-23 21:14:56

标签: javascript arrays

我试图通过它在对象内的对象内的索引来访问特定的数组(对不起,这可能是错误的术语)。

var person = {
    name: ["Tom", "Mike", "Sally"],
    hair: {
        style: ["bob", "weave", "mullet"],
        length: ["long","short","medium"]
    }
}

getDetail(length);

function getDetail(det) {
    var answer = person.hair.det[1];
    console.log("Hair " + det + " is " + answer)  //outputs: "Hair length is long"
}

当我这样做时,我收到的错误是"无法读取属性' 1'未定义"。这告诉我它没有通过' det'变量正确。如果我把它取出并改为长度,它就可以了。

我错过了什么?

谢谢!

2 个答案:

答案 0 :(得分:4)

问题是在你的情况下你应该将一个字符串或一个变量传递给你的getDetail()函数(length本身就是none,因为它既没有先前定义也没有被引用),还有一个事实是,如果要使用变量来指示对象的属性/键,则应使用此类语法:object["property"]。您可以将代码更改为:

getDetail('length');

function getDetail(det) {
    var answer = person.hair[det][1];
    console.log("Hair " + det + " is " + answer)  //outputs: "Hair length is long"
}

答案 1 :(得分:0)

当你说getDetail(length)时,它正在寻找一个名为length的变量,并将其传递给函数。由于它不存在,函数得到undefined

但是,当你编写“myObjectVariableName .etcetera”时,它会专门寻找一个名为“etcetera”的索引 - 所以它甚至不会使用你的det参数 - 而是寻找“det”指数。

您可以编写以下任一项。

myObjectVariableName["myIndexName"]

var myString = "myIndexName";
myObjectVariableName[myString]

这两者都会有相同的结果。

因此,要获得预期的结果,您要做的是将字符串“length”传递给getDetail,然后将.det替换为[det] (darkajax似乎写了什么我想要,但我希望我的解释也有助于理解为什么它不起作用)