循环中的unset和splice

昨日为了满足运营姑凉们的排序需求,写了一段js代码进行数据筛选,却因为循环出现问题耽误了很久,事情大概是这样的:

在javascript中,没有和php中一样的unset方法,如果要释放掉数组中指定元素要使用.splice()方法。由于循环语句的机制导致如果在循环内splice掉其中的元素,循环指针可能出现蹿位,最终就是导致某些元素没有被遍历到。javascript中for in与jquery中的.each都有这个问题,php中也有splice方法,并且php的循环在使用unset和splice的时候都会出现“意外”,而foreach由于他的特殊性幸免遇难。还是看代码吧,这个很有趣的低级错误常常被我们忽略。

1
2
3
4
5
6
7
8
9
10
11
<script>
window.onload = function () {
var a = ['a','b','c','d','e','f','g'];
for(k in a){
alert(a[k]);
if (a[k] == 'c' || a[k] == 'd')
a.splice(k, 1);
}
// output is abcefg
}
</script>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
<?php
$a = array( 'a','b','c','d','e','f','g');
foreach($a as $k=&gt;$v) {
echo $v;
if ($v == 'c' || $v == 'd') {
unset($a[$k]);
}
}
// output is abcdefg
echo "\n";
$a = array( 'a','b','c','d','e','f','g');
foreach($a as $k=&gt;$v) {
echo $v;
if ($v == 'c' || $v == 'd') {
array_splice($a, $v, 1);
}
}
// output is abcdefg
echo "\n";
$a = array( 'a','b','c','d','e','f','g');
for($i=0;$i&lt;count($a);$i++) {
echo $a[$i];
if ($a[$i] == 'c' || $a[$i] == 'd') {
unset($a[$i]);
}
}
// output is abcde
echo "\n";
$a = array( 'a','b','c','d','e','f','g');
for($i=0;$i&lt;count($a);$i++) {
echo $a[$i];
if ($a[$i] == 'c' || $a[$i] == 'd') {
unset($a[$i]);
}
}
// output is abcde
echo "\n";
$a = array( 'a','b','c','d','e','f','g');
for($i=0;$i&lt;count($a);$i++) {
echo $a[$i];
if ($a[$i] == 'c' || $a[$i] == 'd') {
array_splice($a, $i, 1);
}
}
// output is abcefg