자바 스크립트 배열 검색 및 제거 문자열?


134

나는 가지고있다:

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

답변:


186

실제로이 스레드를 최신 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

6
이것은 새로운 상태를 반환 해야하는 Redux에 적합합니다.
colinwong

@Regis는 실제로는 아닙니다. arr.filter는 새로운 배열을 반환합니다. 따라서 arr.filter (e => e! == 'B')는 arr을 수정하지 않습니다. 아니면 당신의 의견을 제대로 이해하지 못했을까요?
Tyrannas

이 작업을 수행하지만 첫 번째 발생을 중지시키는 방법이 있습니까? 5 개 'B'만 있으면 하나만 제거 할 수 있습니까?
Ari

1
@Ari 나는 단지 하나 개의 요소를 제거하기위한 대답을 업데이 트했습니다
Tyrannas

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
역순으로 반복하는 것이 약간 빠르기 때문에 추측하고 있습니다.
벤 클레이튼

1
@ BenClayton : 감사합니다. FWIW는 JavaScript에서 사실이 아닙니다. 0예를 들어 C와 같이 카운트 다운하는 것이 자동으로 더 빠르지는 않습니다. 물론 한도를 캐시하는 한 첫 경기 후에 계속하면 문제가 복잡해집니다 (중단하지 않으면).
TJ Crowder

속도를 높이려면 왜 사용하지 않습니까? : D
Snuffleupagus

11
속도에 관한 것이 아니라 대답에서도 그렇게 말합니다. SKIPPING 요소에 관한 것입니다. 위치 5에 있고 해당 위치를 접합하면 위치 6에있는 formelry 요소 는 이제 5 입니다. 여전히 루프 카운터가 증가하고 다음 반복은 위치 6이며 항목을 건너 뛴 곳입니다. 그렇기 때문에 순서가 반대입니다.
amenthes

1
정방향 루프에서 항목을 제거하고 항목을 제거하면 존재하지 않는 인덱스를 참조하므로 마지막 반복에서 널 포인터 예외가 발생할 수 있습니다.
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()추가 할 수있는 당신의 자바 스크립트 파일에.
qwertymk

네, 우아합니다. 일부 요소 만 제거하는 옵션이 필요한 경우, 예를 들어 첫 번째 요소 만 : 동일한 업데이트 : jsfiddle.net/qpZFd/9
sebilasse

나는 항상 다음과 같은 오류가 발생 Uncaught ReferenceError: array is not defined합니다. 뭐가 잘못 되었 니?
Pathros

이 길을 가고 있다면 .indexOf()조금만 더 쉽게 이용할 수 있습니다 . while-loop 내found 에서 .indexOf()호출에 대한 두 번째 인수로 전달하면 이미 확인되어 동일하지 않은 배열의 요소는 다시 확인되지 않습니다. found = arr.indexOf(what, found);
pimmhogeling

14

간단히

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

-1, 아무것도 발견되지 않으면 indexOf가 반환 됩니다. 그러면 스플 라이스는 배열의 끝에서 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;
};   

온라인 데모 (바이올린)


일치하는 항목이 없으면이 솔루션은 항상 마지막 요소를 제거합니다.
markus s

1

당신은 당신이 자신의 제거를 작성해야합니다. 배열을 반복하고 제거하려는 항목의 색인을 잡고 splice제거하는 데 사용할 수 있습니다.

또는 새 배열을 만들고 현재 배열을 반복하고 현재 개체가 제거하려는 항목과 일치하지 않으면 새 배열에 넣을 수 있습니다.


1

사용하다:

array.splice(2, 1);

이렇게하면 인덱스 2 (3 번째 항목)부터 배열에서 하나의 항목이 제거됩니다.


1
실제로 배열에서 두 번째 항목을 제거하고 인덱스는 0에서 시작합니다. 이 문장은 애매 모호하지만, 더 간단한 예는 array.splice(2,1)인덱스 2에서 1 항목을 배열에서 제거하는 것과 같습니다 . 자세한 내용은 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/splice 를 확인 하십시오
imdzeeshan

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

또는 당신은 사용할 수 있습니다 :

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

changedArray에는 값이없는 'B'가 포함됩니다.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.