Posted at

JavaScriptで配列から特定の要素を削除する方法

More than 3 years have passed since last update.


はじめに

配列から特定の要素を削除するにはいくつか方法があります。

単純に先頭の要素を削除するにはshift()で実現できます:

var ary = ['', '', '', '', ''];

console.log(ary.shift()); // => あ
console.log(ary); // => ['い', 'う', 'え', 'お']

逆に最後の要素を削除するにはpop()で実現できます:

var ary = ['', '', '', '', ''];

console.log(ary.pop()); // => お
console.log(ary); // => ['あ', 'い', 'う', 'え']

また一部の要素を取り出すのはslice()で実現できます:

var ary = ['', '', '', '', ''];

console.log(ary.slice(2, 4)); // => ['う', 'え']
console.log(ary); // => ['あ', 'い', 'う', 'え', 'お']

ここではsplice()を使って、もっと柔軟に好きな位置の要素を削除する方法をまとめてみます。

splice()の初歩的な使い方は次の通りです:

var ary = ['', '', '', '', ''];

console.log(ary.splice(1, 2)); // => ['い', 'う'](1番目から2つ取り出す)
console.log(ary); // => ['あ', 'え', 'お'](取り出された後の配列)


1次元配列

例えば次の配列から1、2、4番目の要素を削除するとします:

['', '', '', '', '']

これは次のコードでできます:

var ary = ['', '', '', '', ''];

var exe = [1, 2, 4]; //削除したい位置(先頭が0であることに注意)
for(var i=0; i<exe.length; i++){
ary.splice(exe[i]-i, 1); //exe[i]-i番目から1つだけ削除
}

この結果、配列aryは次のように加工されます:

['', '']

ポイントは次の部分です:

ary.splice(exe[i]-i, 1);

for文で1周する度に配列が短くなっていくので、回った分だけ前に詰まります

それを考慮して、回った分だけ削除位置を前に詰めます。


2次元配列

配列が2次元になっても基本的には同じです。

2次元の場合は行を削除する場合と列を削除する場合があります。

行の方が簡単なので、まずは行から見ていきましょう。


行を削除

例えば次の配列から1、2、4行目を削除するとします:

[

['', '', '', '', ''],
['', '', '', '', ''],
['', '', '', '', ''],
['', '', '', '', ''],
['', '', '', '', ''],
]

これは次のコードでできます:

var ary = [

['', '', '', '', ''],
['', '', '', '', ''],
['', '', '', '', ''],
['', '', '', '', ''],
['', '', '', '', ''],
];
var exe = [1, 2, 4]; //削除したい位置(先頭が0であることに注意)
for(var i=0; i<exe.length; i++){
ary.splice(exe[i]-i, 1);
}

この結果、配列aryは次のように加工されます:

[

['', '', '', '', ''],
['', '', '', '', ''],
]

つまり行の削除は1次元の場合と全く同じコードで実現できます。


列を削除

ほんのちょっとだけレベルが上がります。

例えば次の配列から1、2、4列目を削除するとします。

[

['', '', '', '', ''],
['', '', '', '', ''],
['', '', '', '', ''],
['', '', '', '', ''],
['', '', '', '', ''],
]

これは次のコードでできます:

var ary = [

['', '', '', '', ''],
['', '', '', '', ''],
['', '', '', '', ''],
['', '', '', '', ''],
['', '', '', '', ''],
];
var exe = [1, 2, 4]; //削除したい位置(先頭が0であることに注意)
for(var i=0; i<ary.length; i++){ //このfor文で行を回す
for(var j=0; j<exe.length; j++){
ary[i].splice(exe[j]-j, 1);
}
}

この結果、配列aryは次のように加工されます:

[

['', ''],
['', ''],
['', ''],
['', ''],
['', ''],
]

ポイントはaryではなくary[i]に対してsplice()を実行することです。


さいごに

もっとスマートな方法をご存知の方は、ぜひ教えて下さい。