var arr = ['a', 'a', 'b', 'c', 'd', 'a', 'a', 'e', 'g', 'a', 'f'];
我們現在將數組中所有的‘ a’ 元素刪除;
arr.forEach(function(key, index) {
key === 'a' ? arr.splice(index, 1) : '';
})
//["a", "b", "c", "d", "a", "e", "g", "f"]
只要相鄰的‘ a’ 元素, 都沒被刪除, splice不但可以刪除原素本身, 還同時可以減少數組長度( 就是抹去一切痕跡),
這樣導致后續的數組元素會代替已經刪除的元素的位置, 但是循環是按照數組的下標按順序刪除, 這樣就會漏掉遷移的元素。
方法一: delete
arr.forEach(function(key, index) {
key === 'a' ? delete arr[index] : '';
})
//["b", "c", "d", "e", "g", "f"]
可以看到這是我們想要的結果, 因為delete這個方法刪除元素時並不會刪除本身的位置, 會有個‘ undefind’ 來代替着元素,
這樣我們的循環隊列的順序就正常了, 但是這樣數組長度是不會有變化的, 這個方法就看自己的需求了
方法二: 取而不刪
簡單的例子:
var newArr = arr.filter(function(key) {
return key !== 'a'
})
//["b", "c", "d", "e", "g", "f"]
一樣的結果, 我們的思路就是既然刪除是因為我們想要得到符合條件的數組, 那我們直接去篩選符合條件的新數組就解決了!
實際中我們面對的業務數據都是比較復雜的,所以下面的稍微復雜一點
復雜的例子:

需求:1 我們需要刪除掉checked為"icon-chosen"的所有父項,以及父項中的子項orderDetails。
2 父項中有多個子項,但如果有一個子項checked是"icon-choose",不是"icon-chosen",那么父項也需要保留下來不被刪除。
//上面的數據保存在productList中,我們看到只有數組中第一個父元素的第二個子元素checked是"icon-choose"
var newProductList = [];
productList.forEach(function(key) {
//首先篩選父項"icon-choose",取出我們需要的父項
if (key.checked == "icon-choose") {
//篩選子項"icon-choose",取出我們需要的子項
var newOrderDetails = key.orderDetails.filter(function(keys) {
return keys.checked == "icon-choose"
});
//將符合條件的子項賦值給被篩選的子項
key.orderDetails = newOrderDetails;
//將篩選和改變的父項放入新的數組
newProductList.push(key);
}
})
console.info(newProductList);

最后的結果就是要保留數組中第一個父元素的第二個子元素checked是"icon-choose",同時保留父元素;數據可能有點多,但其他的只是干擾項,
我們只關注checked屬性就好!
