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 1
边循环边改数组是大忌。
|
2
des 2020-11-28 14:59:27 +08:00 1
不要在循环中修改数组!不要在循环中修改数组!不要在循环中修改数组!
|
4
sugarsalt 2020-11-28 15:07:22 +08:00 1
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 1
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
zackwan95 2020-11-28 15:19:08 +08:00 via iPhone 1
都 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
ddsfeng 2020-11-28 18:08:59 +08:00 2
倒序遍历 可解.
|
15
chenyu8674 2020-11-28 23:59:21 +08:00 1
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
lbyo 2020-11-29 00:47:22 +08:00 1
@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 1
for (i = 0; i < price.length; ) {
if (price[i] == 'apple') { ... } else { i++ } }; 只需要把 for 句首的 i++ 转移到 else 分支里就够了 |
20
pwn 2020-11-30 10:11:14 +08:00 1
不止 JavaScript,任何语言(大概)都是如此,price.length 是每次循环开始的时候会计算的,也就是说在修改了数组 price 之后,price.length 是会变的!会变的!
我通常是在循环体外面把这个值固定下来,let length = price.length,然后才开始循环。 |