場景描述:先單獨勾選幾項,然后點擊全選,此時的已選中數量顯示是正確的。再接着點擊取消全選,頁面沒有選中項,所以已選中數量顯示不正確。
部分代碼
for (var i = 0; i < that.CheckedArray.length; i++) { for (var j = 0; j < dataArr.length; j++) { if (that.CheckedArray[i] == dataArr[j].ID) { that.removeByValue(that.CheckedArray, that.CheckedArray[i]);//調用自定義的根據值移除函數
} } } //自定義方法,根據值去移除
removeByValue: function (arr, val) { for (var i = 0; i < arr.length; i++) { if (arr[i] == val) { arr.splice(i, 1); break; } } },
全部選中時:
調試分析:for循環使用splice()方法執行移除操作之后,因為splice函數會直接對數組進行修改,所以數組中之后的每一項都向前上升一位,導致執行結果不符合預期。that.CheckedArray[i]第一個值是9079,第一次循環時找到匹配值刪除后數組下標值變化,第一個值變成了9082。that.CheckedArray[i]還是第一次循環,dataArr循環也還未結束,所以還會與that.CheckedArray[i]的第一個值進行匹配,9082在9079后邊所以在匹配到9079之后會接着匹配到9082並刪除,此時第一個值變成了9099,由於dataArr循環到最后也沒有找到與9099相匹配的值,所以that.CheckedArray[i]就開始了第二次循環。that.CheckedArray[i]第二個值是9086,再依次匹配,到最后就會剩下9099未被刪除
解決方案:
//for (var i = 0; i < that.CheckedArray.length; i++) {
for (var i = that.CheckedArray.length - 1; i > -1; i--) { //splice刪除后會更改原數組下標所代表的值,使用逆序遍歷
//for (var j = 0; j < dataArr.length; j++) {
for (var j = dataArr.length - 1; j > -1; j--) { if (that.CheckedArray[i] == dataArr[j].ID) { that.removeByValue(that.CheckedArray, that.CheckedArray[i]);//調用自定義的根據值移除函數
} } }