JavaScript配列検索と文字列の削除?


132

私が持っています:

var array = new Array();
array.push("A");
array.push("B");
array.push("C");

私は次のようなことができるようになりたいです:

array.remove("B");

ただし、削除機能はありません。どうすればこれを達成できますか?


5
組み合わせ.indexOf().splice()トリックを行う必要があります。または多分、あるいは、.filter()
Marc B

1
ここを参照してください:stackoverflow.com/questions/3954438/...を
benedict_w

回答:


185

私は実際にこのスレッドをより最近の1行のソリューションで更新しています:

let arr = ['A', 'B', 'C'];
arr = arr.filter(e => e !== 'B'); // will return ['A', 'C']

基本的には、削除する要素とは異なるすべての要素を選択することにより、配列をフィルターに掛けます。

注:はすべての出現を削除します。

編集:

最初の発生のみを削除する場合:

t = ['A', 'B', 'C', 'B'];
t.splice(t.indexOf('B'), 1); // will return ['B'] and t is now equal to ['A', 'C', 'B']

1
このソリューションは配列のコピーを返しますが、spliceを使用すると要素が削除されます。どちらを選択するかは、コンテキストによって異なります。
twhitehead 2017

6
これは、新しい状態を返す必要があるReduxに最適です。
colinwong 2018年

@Regisは実際にはそうではなく、arr.filterは新しい配列を返します。したがって、arr.filter(e => e!== 'B')はarrを変更しません。それともあなたのコメントを正しく理解できなかったのでしょうか?
ティラナス

これを行う方法はありますが、最初の発生時に停止する方法はありますか?それで、1つを削除するのに5つの「B」がある場合はどうでしょうか。
アリ

1
@アリ1つの要素のみを削除するための回答を更新しました
Tyrannas '20 / 10/20

171

リストを逆の順序でループし、.spliceメソッドを使用します。

var array = ['A', 'B', 'C']; // Test
var search_term = 'B';

for (var i=array.length-1; i>=0; i--) {
    if (array[i] === search_term) {
        array.splice(i, 1);
        // break;       //<-- Uncomment  if only the first term has to be removed
    }
}

検索語句のすべての出現を削除する必要がある場合は、逆の順序が重要です。そうしないと、カウンターが増加し、要素をスキップします。

最初のオカレンスのみを削除する必要がある場合、以下も機能します。

var index = array.indexOf(search_term);    // <-- Not supported in <IE9
if (index !== -1) {
    array.splice(index, 1);
}

1
それは逆に反復するために少し速くなることを意図しているので私は推測しています。
Ben Clayton

1
@BenClayton:ありがとう。JavaScriptでは、FWIWは確実に真実ではありません。カウントダウン0は、Cの場合のように自動的に速くなるわけではありません。もちろん、制限をキャッシュしている限り、最初の一致を続けた場合(ただし、停止した場合はそうではありません)、複雑になります。
TJクラウダー2012年

速度を上げる場合は、なぜ使用しないのですか-?:D
Snuffleupagus

11
それはスピードについてではなく、彼の答えでさえそう言っています。それはスキップ要素についてです。位置5にいて、その位置をスプライスすると、位置6にあるformelryの要素は5になります。それでも、ループカウンターは増加し、次の反復は位置6であり、ここでアイテムをスキップしました。それが逆の順序になっている理由です。
amenthes 2015

1
フォワードループでアイテムを削除し、アイテムが削除された場合、存在しないインデックスを参照するため、最後の反復でnullポインター例外がスローされる可能性があります
Drenai

24

ワンライナー一覧

この配列のこの問題を解決しましょう:

var array = ['A', 'B', 'C'];

1.最初のものだけを削除します。 アイテムが存在することが確実な場合に使用します

array.splice(array.indexOf('B'), 1);

2.最後のものだけを削除 します。アイテムが存在することが確実な場合に使用します

array.splice(array.lastIndexOf('B'), 1);

3.すべての出現箇所を削除します。

array = array.filter(v => v !== 'B'); 

21

デモ

あなたが探しているものの場所を見つけて、.indexOf()それを削除する必要があります.splice()

function remove(arr, what) {
    var found = arr.indexOf(what);

    while (found !== -1) {
        arr.splice(found, 1);
        found = arr.indexOf(what);
    }
}

var array = new Array();
array.push("A");
array.push("B");
array.push("C");
    
remove(array, 'B');
alert(array)​​​​;

これはすべての発生を処理します。


サポートしていないブラウザの.indexOf()場合、これをJavaScriptファイルに追加できます。
qwertymk 2012年

うん、エレガント。一部の要素のみを削除するオプションが必要な場合、たとえば最初の要素のみを削除する場合:同じ更新:jsfiddle.net/qpZFd/9
sebilasse

常に次のエラーが発生しますUncaught ReferenceError: array is not defined。なにが問題ですか?
Pathros、2015年

このルートを使用する場合は.indexOf()、もう少しだけ簡単に利用できます。あなたは合格した場合foundに2番目の引数として.indexOf()呼び出しwhileループ内で、すでにチェックされ、等しくない終わった配列の要素が再度チェックされていません: found = arr.indexOf(what, found);
pimmhogeling

14

単に

array.splice(array.indexOf(item), 1);

ええ、例外として、indexOfは-1何も見つからないと返されますが、エラーが発生します。spliceは配列の最後から1つの要素を削除します
Ricky Spanish

2

シンプルなソリューション(ES6)

重複する要素がない場合

Array.prototype.remove = function(elem) {
  var indexElement = this.findIndex(el => el === elem);
  if (indexElement != -1)
    this.splice(indexElement, 1);
  return this;
};   

オンラインデモ(フィドル)


このソリューションでは、一致するものが見つからない場合、常に最後の要素が削除されます。
マーカスの2018

1

あなた自身の削除を書く必要があります。配列をループして、削除する項目のインデックスを取得し、それを使用spliceして削除できます。

または、新しい配列を作成し、現在の配列をループして、現在のオブジェクトが削除するものと一致しない場合は、新しい配列に配置できます。


1

使用する:

array.splice(2, 1);

これにより、インデックス2(3番目のアイテム)から始まる配列から1つのアイテムが削除されます


1
実際には、配列から2番目の項目を削除します。インデックスはゼロから始まります。このステートメントにはあいまいさがあります。より単純な例ではarray.splice(2,1)、配列からインデックス2の1つのアイテムを削除します。詳細については、https:
//developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/spliceを

1
const changedArray = array.filter( function(value) {
  return value !== 'B'
});

またはあなたが使うことができます:

const changedArray = array.filter( (value) => value === 'B');

changedArrayには、値なしの「B」が含まれます。


0

array.spliceを使用

/*array.splice(index , howMany[, element1[, ...[, elementN]]])

array.splice(index) // SpiderMonkey/Firefox extension*/

array.splice(1,1)

ソース:https : //developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/splice


間にカンマarrayとはsplice、ドットなければなりません。
Rob W

修正しようとしましたが、編集は6文字以上である必要があるとSOのポリシーは述べています:/
ben_nuttall
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.