2017-02-06 29 views
0

下面,如果我的代碼爲什麼它沒有根據if語句從數組中刪除對象?

var data = [ 
{ 
    'Number': 'B20051209003301', 
    'Name': 'GGG' 
}, { 
    'Number': 'A20051130027901', 
    'Name': 'BBB' 
}, { 
    'Number': 'H20170206000056', 
    'Name': 'CCC' 
}, { 
    'Number': 'K20051216000301', 
    'Name': 'AAA' 
}, { 
    'Number': 'F20170120000056', 
    'Name': 'DDD' 
}, { 
    'Number': 'A20051020032201', 
    'Name': 'EEE' 
}, { 
    'Number': 'A20071005006001', 
    'Name': 'AAA' 
}, { 
    'Number': 'D20170126000023', 
    'Name': 'AAA' 
}, { 
    'Number': 'A20051020016601', 
    'Name': 'KKK' 
}, { 
    'Number': 'A20051028007501', 
    'Name': 'LLL' 
} 
] 
var removeUselessData = data; 

data.map(function(element, index) { 
    if (element['Name'] === "AAA" || Number(element['Number'].slice(1, 5)) < 2011) { 
     removeUselessData.splice(index, 1); 
    } 
}); 

console.log(removeUselessData); 

結果打印我的終端上是

[ { Number: 'A20051130027901', Name: 'BBB' }, 
    { Number: 'H20170206000056', Name: 'CCC' }, 
    { Number: 'F20170120000056', Name: 'DDD' }, 
    { Number: 'A20071005006001', Name: 'AAA' }, 
    { Number: 'A20051020016601', Name: 'KKK' } ] 

我希望它會刪除小數目比2011年的名稱不能爲「AAA」是什麼。

但結果仍然有他們。

回答

2

你想要的是Array.filter

console.log(data.filter(function(element, index){ 
    return !(element['Name'] === "AAA" || Number(element['Number'].slice(1, 5)) < 2011) 
})); 

現在,至於爲什麼你的代碼isn't工作:

var removeUselessData = data; 

注意,這不會複製數據,它甫一使一個變量指向相同的數組引用(如果從removeUselessData中刪除,則也從數據中刪除)。爲了防止這種情況,你需要做的:

var removeUselessData = data.slice(0); // this will copy the array (not deep copy though) 

從數組現在,當您使用拼接,你要刪除的東西。問題是,在for循環中執行此操作通常不一致,因爲在刪除某些內容時,數組元素現在具有不同的索引,因此數組中的索引與removeUselessData中的索引不匹配。

要解決它,你可以刪除向後,以確保一致性的元素:

for (var index = data.length - 1; index >= 0; index--) { 
    var element = data[index]; 
    if (element['Name'] === "AAA" || Number(element['Number'].slice(1, 5)) < 2011) { 
     removeUselessData.splice(index, 1); 
    } 
} 
相關問題