回答

收藏

在 JavaScript 中循环遍历数组

技术问答 技术问答 453 人阅读 | 0 人回复 | 2023-09-11

在 Java 中,你可以用for循环遍历数组中的对象如下:
! T2 h: t& ?+ m: YString[] myStringArray = {"Hello","World"};for (String s : myStringArray){    / Do something}你能在 JavaScript 做同样的事吗?! S* Z1 h" v, Y6 D0 n* d( a$ ~
                                                               
$ w1 i; [: ]( T2 R" }    解决方案:                                                               
3 N& K: d9 V) a, r  R                                                                三大选项:
' Z3 i( P! o' @' a1 }$ k[ol]for (var i = 0; i
' `$ q( z2 Y+ D/ H9 mxs.forEach((x,i) => console.log(x));; H- ~0 w$ m- @) U7 [- n* m" B  ^
for (const x of xs) { console.log(x); }[/ol]详细示例如下。5 H2 S1 `7 E0 T6 ?: m
1.顺序for循环:
    ! z( }" i1 H9 z$ \, _/ i; r
  • var myStringArray = ["Hello","World"];var arrayLength = myStringArray.length;for (var i = 0; i 优点
      k" X: g' V# a/ m% }, Z4 K
  • " j. `( O- \' b. F
  • 适用于各种环境
    : B5 r3 p3 Y8 H7 h
  • 您可以使用break和continue流控制语句缺点
    . v  z  k9 `& e* U& @) ?4 \

  • 6 O' d! {- N+ e( ?; |; k
  • 太冗长; P8 D; @: q6 D* i
  • 至关重要的* r; e' L8 X' O5 h1 O4 d
  • 一个错误很容易出现(有时也被称为一个错误)栅栏柱错误)2 Array.prototype.forEach.:所述ES说明书介绍了许多有益的阵列方法。其中之一,Array.prototype.forEach,给我们一个迭代数组的简单方法:[code]const array = ["one","two","three"]array.forEach(function (item,index) {  console.log(item,index);});2 ~2 g5 C: c2 R* _
距离编写 ES5 标准发布时间(2009年 12 月)近十年,几乎所有现代引擎都在桌面、服务器和移动环境中实现,使用安全。
8 A' P/ z- X  r$ K1 y+ M. [  N! `2 ^并且使用 ES6 箭头函数语法更简洁:
1 ^. R3 J7 F& W) o" k
    array.forEach(item => console.log(item));# J  L, @+ f; Z' S
除非您计划支持古老的平台(例如,Internet Explorer 11),否则箭头函数也会被广泛实现;你也可以安全地去。# U0 T- Z4 s9 L, ?: R
优点$ i, c2 A6 \! L/ a/ B% a
非常简短和简洁。
  Q# n' y/ X9 d声明式
缺点
- d! `0 [# |+ I$ F; a不能使用break/continue通常,你可以break通过在迭代数组元素之前过滤数组元素来替换退出命令循环的需要,例如:% G8 C2 k; o2 y( \
    array.filter(item => item.condition  console.log(item))
    0 t6 v+ {" F7 V3 N9 P: j' k
请记住,如果您正在迭代一个数组构建另一个数组,您应该使用map. 我多次看到这种反模式。9 Y; J9 y/ {4 O5 O$ f) H6 u
反模式:; G; Y7 d* P6 h# r% ]' W+ X
    ! t# n$ f# u8 `: d
  • const numbers = doubled = [];numbers.forEach((n,i) => { doubled = n * 2 }code]*地图的*正确用例:[code]const numbers = [1,2,3,4,5];const doubled = numbers.map(n => n * 2);console.log(doubled);1 s4 m3 U( |1 h
另外,如果你想的话降低例如,要总结数字数组,你应该使用它减少方法。4 B; y) h) \* u) x- w5 |( n- o
反模式:6 n" k2 f% ]3 S5 _) ?8 w  U  ]

    ) p& ^* g8 g; a; C& G1 {& d9 z
  • const numbers = [1,2,3,4,5];const sum = 0;numbers.forEach(num => { sum  = num(//code]正确使用*reduce*:[code]const numbers = [1,2,3,4,5];const sum = numbers.reduce((total,n) => total   n,0);console.log(sum);/ u$ Z! y3 x& ]$ S: Z
3. ES6for-of声明:所述ES6标准引入了迭代对象的概念,并限制了新的构建for...of的语句。
+ v- ~1 `* t9 x1 l: J. ^0 y该语句适用于任何类型的可迭代对象和生成器(任何具有\[Symbol.iterator\]属性对象)。
1 v. G4 a6 u# ~, M: H/ [1 A6 m数组对象是 ES内置可迭代对象在6 中定义,因此您可以使用以下句子:
: s! w; m! Y% m+ s3 B
    let colors = ['red','green','blue'];for (const color of colors){    console.log(color);}, s. y9 t7 U  d8 W. |4 l, m
优点$ y2 _# I0 E6 E/ s3 R8 }
它可以迭代各种对象。$ Y3 a' Q% |2 C
可以使用正常的流控制语句(break/ continue)。0 Y) y( ?# C1 \! d1 x
对迭代串行异步值非常有用。
缺点
' C9 s, P8 g7 X$ @2 q, ?/ Y9 Y) E如果你的目标是旧浏览器,转译后的输出可能会让你大吃一惊。不使用 for...in@zipcodeman 建议使用这个for...in语句,但for-in该语句旨在避免迭代数组枚举对象属性。2 u) ?9 o7 a3 K3 {" s+ S5 ]
由于:+ @8 Q* L3 l6 H- i$ _
不保证迭代顺序;数组索引可能不会按数字顺序访问。6 \& V) L$ {" j4 f0 T% R, W
还列出了继承的属性。
第二点是,如果你扩展,它会给你带来很多问题。Array.prototype如果对象包含一种方法,则该属性也将被列举。
& A; S0 U% Q' y例如:) Y5 x1 J0 c9 j' [% I: Y' G
    Array.prototype.foo = "foo!";var array = ['a','b','c'];for (var i in array)    console.log(array);}0 l$ L5 a7 Q6 k. W: w: V& ?
控制台记录上述代码a”、“b”、“c”和“foo!”。( v5 f/ ~% K6 w% m
如果使用一些严重依赖原型增强的库(如MooTools),这可能是一个特殊的问题。
6 Y& Q! k1 l5 w8 I' h5 n& Zfor-in正如我之前所说,这句话是用来用的枚举例如:
4 `8 X6 V. d8 Q* y[code]var obj =    "a": 1,   "b": 2,   "c": 3};for (var prop in obj)    if (obj.hasOwnProperty(prop))        // or if (Object.prototype.hasOwnProperty.call(obj,prop)) for safety...        console.log("prop: "   prop   " value: "   obj[prop])  code]在上面的例子中,该hasOwnProperty方法只允许您枚举自己的属性。这样,只有对象物理的属性,没有继承的属性。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则