Javascript 循环好像哪里不对,哪位老哥帮看下。
price = ['apple', 10, 'orange', 6, 'apple', 10, 'apple', 10, 'banana', 5]; for (i=0; i<price.length; i++) { if (price[i] == 'apple') { pair = price.splice(i, 2); console.log(i, pair); console.log(price); }; };
期望得到的结果是:
0 ["apple", 10] ["orange", 6, "apple", 10, "apple", 10, "banana", 5] 2 ["apple", 10] ["orange", 6, "apple", 10, "banana", 5] 2 ["orange", 6, "banana", 5]
运行当前代码得到的结果是:
0 ["apple", 10] ["orange", 6, "apple", 10, "apple", 10, "banana", 5] 2 ["apple", 10] ["orange", 6, "apple", 10, "banana", 5]
![]() | 1 noe132 2020-11-28 14:55:17 +08:00 ![]() 边循环边改数组是大忌。 |
![]() | 2 des 2020-11-28 14:59:27 +08:00 ![]() 不要在循环中修改数组!不要在循环中修改数组!不要在循环中修改数组! |
![]() | 4 sugarsalt 2020-11-28 15:07:22 +08:00 ![]() 0 ["apple", 10] ["orange", 6, "apple", 10, "apple", 10, "banana", 5] 2 ["apple", 10] ["orange", 6, "apple", 10, "banana", 5] 此时 i 已经等于 2 了,再++就是 3,自然找不到 apple 了 |
![]() | 5 hoyixi 2020-11-28 15:08:26 +08:00 ![]() filter 一下,返回一个新数组好了,有 JS 内置实现 |
![]() | 6 luob 2020-11-28 15:08:35 +08:00 你这不都找到原因了吗…… |
![]() | 7 aaronlam 2020-11-28 15:12:34 +08:00 via iPhone 实在不济,你在外面搞个新数组,不就好了。。 |
![]() | 8 bQ3u9RAQt4125PUK 2020-11-28 15:19:08 +08:00 via iPhone ![]() 都 ES2020 了,用 array 内置的 api 吧,这玩意用 reduce 正合适 |
9 Caballarii 2020-11-28 16:18:13 +08:00 从右向左循环就 ok 了 |
![]() | 10 xiangyuecn 2020-11-28 16:22:52 +08:00 这玩意跟语言无关, 什么 filter ES2020 “不要在循环中修改数组”,没有一毛钱关系 |
11 TommyDx 2020-11-28 16:29:34 +08:00 两边一起减,少了循环次数 |
![]() | 12 sudoy OP 谢谢大家回复,已经找到解决办法了:就是搞个新的数组 |
![]() | 13 xqin 2020-11-28 18:08:59 +08:00 ![]() 倒序遍历 可解. |
![]() | 15 chenyu8674 2020-11-28 23:59:21 +08:00 ![]() price = ['apple', 10, 'orange', 6, 'apple', 10, 'apple', 10, 'banana', 5]; for (i=0; i<price.length; i++) { if (price[i] == 'apple') { pair = price.splice(i, 2); i -= 2; }; }; |
![]() | 16 chenyu8674 2020-11-29 00:03:07 +08:00 @chenyu8674 #15 困脑抽了,i--就行 |
![]() | 17 hive 2020-11-29 00:47:22 +08:00 ![]() @chenyu8674 #16 不光需要 i-- ``` let price = ['apple', 10, 'orange', 6, 'apple', 10, 'apple', 10, 'banana', 5]; for (i = price.length - 1; i >= 0; i--) { if (price[i] == 'apple') { pair = price.splice(i, 2); console.log(i, pair); console.log(price); }; } ``` |
![]() | 18 autoxbc 2020-11-29 03:54:34 +08:00 ![]() for (i = 0; i < price.length; ) { if (price[i] == 'apple') { ... } else { i++ } }; 只需要把 for 句首的 i++ 转移到 else 分支里就够了 |
![]() | 20 pwn 200-11-30 10:11:14 +08:00 ![]() 不止 Javascript,任何语言(大概)都是如此,price.length 是每次循环开始的时候会计算的,也就是说在修改了数组 price 之后,price.length 是会变的!会变的! 我通常是在循环体外面把这个值固定下来,let length = price.length,然后才开始循环。 |