我可以用“map”代替“for each”/“for in”吗?

时间:2010-04-23 04:54:50

标签: javascript arrays loops

现在javascript has the "map" function暂停数组。

似乎可以将它用作'foreach'运算符,例如:

fruitbowl.map(function(fruit){ 
                  ... do stuff with fruit
              })

这比说

更好还是更坏
for(var i in fruitbowl){ 
     ... do stuff with fruitbowl[i] 
}

保存必须使用索引但添加回调;它似乎并不常见,所以我犹豫使用但仍然想要。

5 个答案:

答案 0 :(得分:7)

你提到的三种方法有不同的用途。

Array.prototype.map方法的目的是创建一个 new array ,其结果是在每个数组元素上调用回调函数。

Array.prototype.forEach方法的目的是迭代一个数组,每个数组元素执行一次提供的回调函数。

for...in语句的目的是枚举对象属性

我认为应该避免使用for...in语句来遍历任何类似于数组的 1 对象,其中真正的目的是迭代而不是数字索引而不是枚举对象属性(即使知道这些索引是属性)。

避免for...in迭代类似数组的对象的原因:

  • 除了数组元素之外,迭代继承的用户定义属性,如果您使用像MooTools这样的库来扩展Array.prototype对象,您将看到所有这些扩展属性。
  • 迭代的顺序是任意的,可能无法按数字顺序访问元素。

看一下这篇文章:


1 类似数组的对象我指的是包含连续数字属性和length属性的任何对象

答案 1 :(得分:3)

使用被认为是有效的,但是严格地使用地图操作代替其副作用是不好的风格。

答案 2 :(得分:1)

可读性非常值得。地图可能会让那些从未见过这种方式的人感到困惑。它违反了“最不惊讶的原则”。

答案 3 :(得分:1)

在Perl中,地图的使用方式相似但更自然。

我的经验法则是,如果它不比循环读取更好,那么就不要使用它。很难调试。但是对于certain functions,map比循环更自然。如果你需要抓住它 - 不要这样做。可怜跟随你的人,包括你自己从现在起的那个人!

答案 4 :(得分:1)

不要使用map作为副作用。如果您的任务是迭代数组以对每个对象执行某些操作,请使用foreach。如果要映射值,例如转义一个字符串数组,使用map。没有什么比清晰度和程序员更聪明的意图了。