29
37

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Posted at

はじめに

配列から特定の要素を削除するにはいくつか方法があります。
単純に先頭の要素を削除するには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()を実行することです。

さいごに

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

29
37
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
29
37

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?