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() メソッドを使う方法があります。