jQuery를 사용하여 배열에서 특정 값을 제거하는 방법


419

다음과 같은 배열이 있습니다. var y = [1, 2, 3];

2array 에서 제거 하고 싶습니다 y.

jQuery를 사용하여 배열에서 특정 값을 제거하려면 어떻게합니까? 나는 시도 pop()했지만 항상 마지막 요소를 제거합니다.


8
경고 : 가장 많이 찬성 된 답변 중 일부에는 부작용이있을 수 있습니다. 예를 들어 어레이에 제거 할 요소가 포함되어 있지 않은 경우 잘못된 작업을 수행 할 수 있습니다. 주의해서 사용하십시오 .
Ricardo

이 대답은 일반 자바 스크립트로, 나를 위해 일한 stackoverflow.com/a/5767357/4681687
chimos

splice () 및 $ .inArray ()를 사용하여 내 의견을 참조하십시오. 루프를 사용하지 않고이 문제를 해결했으며 깨끗합니다.
user253780

답변:


619

작동하는 JSFIDDLE

다음과 같이 할 수 있습니다 :

var y = [1, 2, 2, 3, 2]
var removeItem = 2;

y = jQuery.grep(y, function(value) {
  return value != removeItem;
});

결과:

[1, 3]

http://snipplr.com/view/14381/remove-item-from-array-with-jquery/


2
그것은 좋은 소식이며 그렇습니다. 올바른 수정이 필요했습니다 :)
Sarfraz

2
기본 JS 메소드에 관한 @ user113716 답변이 올바른 방법이라고 생각합니다. 모든 기본 방법이 항상 선호되고 빠릅니다.
neoswf 2016 년

114
이 답변이 완전히 틀리지 않습니까? 배열에서 항목을 제거하지 않고 누락 된 항목으로 새 배열을 만듭니다. 그것들은 전혀 같지 않습니다.
James Moore

5
그것은 O (n)의 복잡성을 제거하는 것입니다. 배열에 더 많은 값이있을수록 최악의 상황이 될 것입니다.
Lyth

2
O (n)의 복잡성은 문제가되지 않습니다.
Omar Tariq

370

jQuery를 사용하면 다음과 같이 한 줄 작업을 수행 할 수 있습니다.

예 : http://jsfiddle.net/HWKQY/

y.splice( $.inArray(removeItem, y), 1 );

native .splice()및 jQuery를 사용합니다 $.inArray().


13
@Elankeeran-천만에요. : o) 첫 번째 인스턴스 만 제거합니다. 여러 개를 제거하면 작동하지 않습니다.
user113716

7
또한 removeItem을 배열에 존재하지 않는 값으로 변경하고 배열의 마지막 항목을 제거했습니다. removedItem의 존재가 확실하지 않은 경우이를 사용하십시오. y = $ .grep (y, function (val) {return val! = removeItem;});
Solburn

52
경고-잘못된 품목을 제거 할 수 있습니다! 값이 없으면 $ .inArray는 -1을 반환하고 .splice는 음수 인덱스를 '끝에서'로 처리하므로 제거하려는 값이 없으면 다른 값이 대신 제거됩니다. 또한 $ .grep은 모든 항목을 제거하지만이 방법은 첫 번째 항목 만 제거합니다.
라이언 윌리엄스

1
위에서 설명한 두 가지 문제를 해결하려면 다음과 같이 while루프와 임시 변수를 사용하십시오.var found; while ((found = $.inArray(removeItem, y)) !== -1) y.splice(found, 1);

1
.indexOf()jQuery 대신 ES5를 사용하는 것이 훨씬 좋지만 다음 검색의 시작점으로 찾은 마지막 인덱스를 사용할 수 있기 때문에 매번 전체 배열을 검색하는 것보다 훨씬 효율적입니다. var found=0; while ((found = y.indexOf(removeItem, found)) !== -1) y.splice(found, 1);

50

jQuery.filter방법이 유용합니다. Array객체에 사용할 수 있습니다.

var arr = [1, 2, 3, 4, 5, 5];

var result = arr.filter(function(elem){
   return elem != 5; 
});//result -> [1,2,3,4]

http://jsfiddle.net/emrefatih47/ar0dhvhw/

Ecmascript 6에서 :

let values = [1,2,3,4,5];
let evens = values.filter(v => v % 2 == 0);
alert(evens);

https://jsfiddle.net/emrefatih47/nnn3c2fo/


4
실제로 기존 어레이를 변경하지 않고 새로운 어레이를 생성하더라도 제안 된 솔루션 중에서 가장 잘 작동하는 것 같습니다. 존재하지 않는 값이나 빈 배열로도 작동합니다. JSFiddle에서 빠른 성능 검사 : 800.000 값을 가진 배열로 완료하는 데 약 6 초가 걸렸습니다. 그래도 빠르면 확실하지 않습니다.
Flo

2
이 솔루션은 jQuery 필터 방법이 아닌 바닐라 JS 고차 함수 필터를 사용하고 있습니다.
Kalimah

나는 그것을 좋아한다! jquery가 아니지만 최상의 솔루션 인 것 같습니다.
Sam

36

underscore.js 를 사용할 수 있습니다 . 정말 간단합니다.

귀하의 경우 작성해야 할 모든 코드는-

_.without([1,2,3], 2);

결과는 [1,3]이됩니다.

작성하는 코드가 줄어 듭니다.


34

jQuery 방법은 아니지만 ... 더 간단한 방법을 사용하지 않는 이유는 무엇입니까? 다음 배열에서 'c'를 제거하십시오.

var a = ['a','b','c','d']
a.splice(a.indexOf('c'),1);
>["c"]
a
["a", "b", "d"]

당신은 또한 사용할 수 있습니다 : (나 자신에게주의 : 소유하지 않은 객체를 수정하지 마십시오 )

Array.prototype.remove = function(v) { this.splice(this.indexOf(v) == -1 ? this.length : this.indexOf(v), 1); }
var a = ['a','b','c'];
a.remove('c'); //value of "a" is now ['a','b']

추가가 더 간단합니다a.push('c')


9
작동하지 않습니다. 찾을 수없는 경우 배열에서 마지막 항목을 제거합니다.
Timothy Aaron

7
IE8-에서는 indexOf가 지원되지 않습니다.
Boude

1
고마워요.
Jay Momaya

22

배열에서 항목 제거

var arr = ["jQuery", "JavaScript", "HTML", "Ajax", "Css"];
var itemtoRemove = "HTML";
arr.splice($.inArray(itemtoRemove, arr), 1);

14
//This prototype function allows you to remove even array from array
Array.prototype.remove = function(x) { 
    var i;
    for(i in this){
        if(this[i].toString() == x.toString()){
            this.splice(i,1)
        }
    }
}

사용 예

var arr = [1,2,[1,1], 'abc'];
arr.remove([1,1]);
console.log(arr) //[1, 2, 'abc']

var arr = [1,2,[1,1], 'abc'];
arr.remove(1);
console.log(arr) //[2, [1,1], 'abc']

var arr = [1,2,[1,1], 'abc'];
arr.remove('abc');
console.log(arr) //[1, 2, [1,1]]

이 프로토 타입 함수를 사용하려면 코드에 붙여 넣어야합니다. 그런 다음 '점 표기법'을 사용하여 모든 배열에 적용 할 수 있습니다.

someArr.remove('elem1')

조금 더 설명하면 여기서 그리워하지 않을 것입니다!
Gaz Winter

이 프로토 타입 함수를 사용하려면 코드에 붙여 넣어야합니다. 그런 다음 '점 표기법'을 사용하여 배열에 적용 할 수 있습니다. 예 : someArr.remove ( 'elem1')
yesnik

3
이와 같은 유일한 문제는 전역 Array 객체의 remove 메소드를 덮어 쓰는 것입니다. 즉, 기본 동작에 의존하는 프로젝트의 다른 코드는 버그가있는 동작으로 끝납니다.
jmort253

2
또 다른 문제는 전역 변수 i를 덮어 씁니다.
Roland Illig


5

다음과 같이 .not 함수를 사용할 수 있습니다.

var arr = [ 1 , 2 , 3 , 5 , 8];
var searchValue = 2;

var newArr = $(arr).not([searchValue]).get();

2
값이 없으면 전체 배열을 지우므로 searchValue = 4는 빈 배열을 반환합니다.
Julian K

3
코드를 jsfiddle에 복사하고 searchValue4로 변경하고 코드를 실행했는데 문제가 발견되지 않았습니다. @JulianK
RST

4

내 버전의 user113716 님의 답변입니다. 일치하는 것이 없으면 좋지 않은 값을 제거합니다.

var y = [1, 2, 3]
var removeItem = 2;

var i = $.inArray(removeItem,y)

if (i >= 0){
    y.splice(i, 1);
}

alert(y);

일치하는 항목이 있으면 1 개의 항목을 제거하고 일치하는 항목이 없으면 0을 제거합니다.

작동 방식 :

  • $ .inArray (value, array)는의 첫 번째 색인을 찾는 jQuery 함수 value입니다.array
  • 위의 값은 값을 찾지 못하면 -1을 반환하므로 제거하기 전에 i가 유효한 색인인지 확인하십시오. 인덱스 -1을 제거한다는 것은 마지막을 제거하는 것을 의미하며 여기서는 도움이되지 않습니다.
  • .splice (지수는 카운트)를 제거 count값의 수에서 시작하여 index우리가 찾는 때문에, count의를1

3
//in case somebody needs something like this:  multidimensional array (two items)

var ar = [[0,'a'],[1,'b'],[2,'c'],[3,'d'],[4,'e'],[5,'f']];

var removeItem = 3;  


ar = jQuery.grep(ar, function(n) {
  return n[0] != removeItem;   //or n[1] for second item in two item array
});
ar;

3

스플 라이스에는 간단한 해결책이 있습니다. W3School 스플 라이스 구문 에 따르면 다음과 같습니다.

array.splice(index, howmany, item1, ....., itemX)

색인 필수 사항. 항목을 추가 / 제거 할 위치를 지정하는 정수입니다. 음수 값을 사용하여 배열 끝에서 위치를 지정하십시오.

howmany 필수. 제거 할 항목 수입니다. 0으로 설정하면 항목이 제거되지 않습니다

item1, ..., itemX 선택 사항. 배열에 추가 할 새 항목

다음 js는 주어진 배열에서 하나 이상의 일치하는 항목을 찾으면 배열의 마지막 항목을 제거하지 않습니다.

var x = [1,2,3,4,5,4,4,6,7];
var item = 4;
var startItemIndex = $.inArray(item, x);
var itemsFound = x.filter(function(elem){
                            return elem == item;
                          }).length;

또는

var itemsFound = $.grep(x, function (elem) {
                              return elem == item;
                           }).length;

최종은 다음과 같아야합니다

x.splice( startItemIndex , itemsFound );

도움이 되었기를 바랍니다.


3

배열에 요소가 존재하는지 먼저 확인

$.inArray(id, releaseArray) > -1

위의 행은 해당 요소가 배열에있는 경우 해당 요소의 색인을 리턴하고, 그렇지 않으면 -1을 리턴합니다.

 releaseArray.splice($.inArray(id, releaseArray), 1);

위의 줄은이 요소를 발견하면 배열에서 제거합니다. 아래의 논리를 요약하면 배열에서 요소를 확인하고 제거하는 데 필요한 코드가 있습니다.

  if ($.inArray(id, releaseArray) > -1) {
                releaseArray.splice($.inArray(id, releaseArray), 1);
            }
            else {
                releaseArray.push(id);
            }

2

배열의 객체 속성에 따라 여러 객체를 한 번에 삭제 해야하는 비슷한 작업이있었습니다.

그래서 몇 번의 반복 후에 나는 다음과 같이 끝납니다 :

list = $.grep(list, function (o) { return !o.IsDeleted });

2

다음과 같이 pick_and_remove()함수로 Array 클래스를 확장했습니다 .

var ArrayInstanceExtensions = {
    pick_and_remove: function(index){
        var picked_element = this[index];
        this.splice(index,1);
        return picked_element;
    } 
};
$.extend(Array.prototype, ArrayInstanceExtensions);

약간 장황하게 보일 수 있지만 pick_and_remove()원하는 배열을 호출 할 수 있습니다 !

용법:

array = [4,5,6]           //=> [4,5,6]
array.pick_and_remove(1); //=> 5
array;                    //=> [4,6]

이 모든 것을 포켓몬 테마의 행동으로 볼 수 있습니다 .


2
/** SUBTRACT ARRAYS **/

function subtractarrays(array1, array2){
    var difference = [];
    for( var i = 0; i < array1.length; i++ ) {
        if( $.inArray( array1[i], array2 ) == -1 ) {
                difference.push(array1[i]);
        }
    }
return difference;
}  

그런 다음 코드의 어느 곳에서나 함수를 호출 할 수 있습니다.

var I_like    = ["love", "sex", "food"];
var she_likes = ["love", "food"];

alert( "what I like and she does't like is: " + subtractarrays( I_like, she_likes ) ); //returns "Naughty :P"!

이것은 모든 경우에 작동하며 위 방법의 문제를 피합니다. 희망이 도움이됩니다!


2

이것을 시도해보십시오.

_clientsSelected = ["10", "30", "12"];
function (removeItem) {
console.log(removeItem);
   _clientsSelected.splice($.inArray(removeItem, _clientsSelected), 1);
   console.log(_clientsSelected);
`enter code here`},

2

여기에서 두 번째로 많이 찬성 된 답변은 OP가 원하는 의도 된 동작에 대한 한 줄짜리 jQuery 메소드에 가능한 가장 가까운 트랙에 있지만 코드 끝에서 우연히 발견되었으며 결함이 있습니다. 제거 할 항목이 실제로 배열에 없으면 마지막 항목이 제거됩니다.

일부는이 문제를 발견했으며 일부는이를 방지하기 위해 반복하는 방법을 제공했습니다. 나는 찾을 수있는 가장 짧고 가장 깨끗한 방법을 제공 하며이 방법에 따라 코드를 수정하는 방법에 대한 답변 아래에 의견을 제시했습니다.

var x = [1, 2, "bye", 3, 4];
var y = [1, 2, 3, 4];
var removeItem = "bye";

// Removing an item that exists in array
x.splice( $.inArray(removeItem,x), $.inArray(removeItem,x) ); // This is the one-liner used

// Removing an item that DOESN'T exist in array
y.splice( $.inArray(removeItem,y), $.inArray(removeItem,y) ); // Same usage, different array

// OUTPUT -- both cases are expected to be [1,2,3,4]
alert(x + '\n' + y);

배열 x 는 "bye"요소를 쉽게 제거하고 배열 y 는 변경되지 않습니다.

인수 $.inArray(removeItem,array)를 두 번째 인수 로 사용하면 실제로 접속할 길이가됩니다. 항목을 찾지 못 했으므로로 평가 array.splice(-1,-1);하지 않고 연결되지 않습니다.


1

바닐라 JavaScript를 사용하여 어레이에서 2를 안전하게 제거하려면 :

// Define polyfill for browsers that don't natively support Array.indexOf()
if (!Array.prototype.indexOf) {
  Array.prototype.indexOf = function(searchElement, fromIndex) {
    var k;
    if (this===null) {
      throw new TypeError('"this" is null or not defined');
    }
    var O = Object(this),
      len = O.length >>> 0;
    if (len===0) return -1;
    var n = +fromIndex || 0;
    if (Math.abs(n)===Infinity) n = 0;
    if (n >= len) return -1;
    k = Math.max(n >= 0 ? n : len - Math.abs(n), 0);
    while (k < len) {
      if (k in O && O[k]===searchElement) return k;
      ++k;
    }
    return -1;
  };
}

// Remove first instance of 2 from array
if (y.indexOf(2) > -1) {
  y.splice(y.indexOf(2), 1);
}

/* To remove all instances of 2 from array, change 'if' to 'while':
while (y.indexOf(2) > -1) {
  y.splice(y.indexOf(2), 1);
}
*/

console.log(y);  // Returns [1, 3]

폴리 필 소스 : Mozilla


0

Sarfraz의 답변에 추가하기 위해 아무도 그것을 기능으로 만들지 않았습니다.

배열에서 동일한 값을 두 번 이상 가진 경우 .filter 메소드를 사용하여 ddagsan의 답을 사용하십시오.

function arrayRemoveVal(array, removeValue){
	var newArray = jQuery.grep(array, function(value) {return value != removeValue;});
	return newArray;
}
var promoItems = [1,2,3,4];	
promoItems = arrayRemoveVal(promoItems, 3);// removes 3
console.log(promoItems);
promoItems = arrayRemoveVal(promoItems, 3);// removes nothing
console.log(promoItems);
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/1.2.3/jquery.min.js"></script>

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