为什么这个对象没有正确解析?

时间:2012-08-28 00:25:00

标签: javascript algorithm iterator

尝试使用JavaScript复制Python中的隐式迭代器,我的代码不会返回“Dylan”,尽管是男性。

的Python:

names = [person.name for person in roster if person.male]

JavaScript算法测试:

roster = {
    person: [
        {
            name: "Katie",
            male: false
        },
        {
            name: "Dylan",
            male: true
        },
        {
            name: "Alex",
            male: true
        },
        {
            name: "John",
            male: true
        }
    ]
}

var names = []
var number = -1

for(var loop = 0; loop < roster.person.length; loop++) {
    if(roster.person[loop].male == true) {
        names[number++] = roster.person[loop].name
    }
}

console.info(names)

&GT;&GT;&GT; [code]返回 - &gt; [“Alex”,“John”]

这是为什么?我的循环遍历所有值,我的if语句有效。

2 个答案:

答案 0 :(得分:2)

那是因为你试图在数组的-1位置插入一个元素。见Increment and decrement operators

使用++number代替number++

for(var loop = 0; loop < roster.person.length; loop++) {
    if(roster.person[loop].male == true) {
        names[++number] = roster.person[loop].name
    }
}

或者将变量number初始化为0而不是-1,或者不使用变量来保存当前索引值,只需使用.push,即可添加数组的新元素。

此外,您无需与true明确比较,表达式的计算结果为true就足够了:

for (var loop = 0; loop < roster.person.length; loop++) {
    if (roster.person[loop].male) {
        names.push(roster.person[loop].name);
    }
}

答案 1 :(得分:2)

您将Dylan指定为索引-1。 number应该从0开始。另外,为什么要手动?只需使用Array.push

var names = []

for(var loop = 0; loop < roster.person.length; loop++) {
    if(roster.person[loop].male == true) {
        names.push(roster.person[loop].name);
    }
}