JavaScript - 配列の特定要素の削除に some() は使わない方がいい
JavaScript で配列を扱っていて、 特定の値の要素を削除したい場合があります。
この場合、some() メソッドが利用できそうですが、 some() を使うと「削除対象のデータが連続している時」に不具合が生じます。
ここでは、some() で正常に処理できるケース、不具合が生じるケース、 代替方法について説明します。
some() メソッドで、配列の特定の要素を削除できるケース
配列 arr から、「2」が入っている要素を削除します。
var arr = [1, 2, 3, 4, 5];
var del_value = 2; // 削除する値
arr.some(function(value, i){
if (value == del_value){
arr.splice(i, 1);
}
})
console.log(arr); // Array [ 1, 3, 4, 5 ]
上の配列のように、データに重複がない場合は正常に動作します。
some() で不具合が生じるケース
次の配列 arr は、削除する値「2」が連続して格納されています。
var arr = [1, 2, 2, 3, 4, 5];
var del_value = 2; // 削除する値
arr.some(function(value, i){
if (value == del_value){
arr.splice(i, 1);
}
})
console.log(arr); // Array [ 1, 2, 3, 4, 5 ]
上の配列のように、削除対象のデータが連続して格納されている場合はうまくいきません。
splice() メソッドで削除した後に、 1つ飛ばして次の要素をチェックするため、このような不具合が生じます。
ですから、配列で特定値の要素を削除する場合、some() メソッドは使わない方がいいでしょう。
代替方法
代替方法の1つとして、filter() メソッドがあります。
filter() メソッドを使って、特定値を除いた配列を作成したい場合は、次のコードで実現できます。
var arr = [1, 2, 2, 3, 4, 5];
var del_value = 2; // 削除する値
arr = arr.filter(function(value){return value != del_value;});
console.log(arr); // Array [ 1, 3, 4, 5 ]
これなら正常に削除できます。
まとめ
特定の値の要素を削除したい場合、some() メソッドを使うと不具合が生じるケースがあります。
ですからsome() メソッドは使わない方がいいでしょう。
代替方法の1つとして、filter() メソッドを使う方法があります。