【问题标题】:Object.keys to iterate arraysObject.keys 迭代数组
【发布时间】:2013-01-16 06:15:07
【问题描述】:

我目前在我的代码中使用两种迭代:

对于对象(sn-p 1):

for (var key in obj) {
    if (obj.hasOwnProperty(key)) {
        // do stuff with key and obj[key]
    }
}

对于数组(sn-p 2):

for (var i=0, count=arr.length;i<count;i++) {
    // do stuff with i and arr[i]
}

我想简化我的代码并为对象和数组使用一个函数(sn-p 3):

var keys=Object.keys(arrorobj);
for (var i=0, count=keys.length;i<count;i++) {
    // do stuff with keys[i] and arrorobj[keys[i]]
}

我知道 sn-p 3 适用于对象,但它是否也可以像我期望的那样对数组工作,并替换 sn-ps 1 和 2?特别是,我可以保证在所有浏览器(嗯,至少支持 Object.keys 的浏览器)中,sn-p 3 都会尊重键顺序(从索引 0 开始)?

[edit] 我计划将它特别用于对象的深度合并。我当前的代码很重,因为在每个级别我都有 3 个分支,具体取决于类型(数组、对象或其他)。

【问题讨论】:

    标签: javascript arrays object for-loop


    【解决方案1】:

    当您的数组中唯一可枚举的属性是编号槽(Array 的默认值)时,它会起作用,但它不能保证返回属性的顺序,因为它们被定义为以for ( in ) 顺序排列,它并不总是以数字方式迭代(取决于属性的分配方式)。

    如果您分配了另一个属性,它也会被枚举(这不会发生在更标准的迭代技术中)。

    对于空槽(例如new Array(25)),它的行为也不会完全相同,因为for 循环会遍历这些。

    一般建议对数组使用for 循环,或forEach() 方法(或相关方法)。

    【讨论】:

    • 谢谢!你有一个简单的例子来告诉我以错误的顺序迭代数组索引吗?我经常听到这个警告,但在实践中从未见过......
    • @Christophe 这是一个好的开始:code.google.com/p/v8/issues/detail?id=164
    • 好吧,这个例子实际上是朝着正确的方向(对我来说),因为它尊重数字顺序。我会更担心相反的情况(我真正关心的是数组)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-29
    • 2020-03-29
    • 2015-03-14
    相关资源
    最近更新 更多