Cách xóa giá trị cụ thể khỏi mảng bằng jQuery


419

Tôi có một mảng trông như thế này: var y = [1, 2, 3];

Tôi muốn loại bỏ 2khỏi mảng y.

Làm cách nào tôi có thể xóa một giá trị cụ thể khỏi một mảng bằng jQuery? Tôi đã thử pop()nhưng điều đó luôn loại bỏ yếu tố cuối cùng.


8
CẢNH BÁO : một số câu trả lời được đánh giá cao nhất có thể có tác dụng phụ, ví dụ: thực hiện các thao tác sai khi mảng không chứa phần tử cần xóa. Hãy sử dụng chúng một cách cẩn thận .
Ricardo

Câu trả lời này có hiệu quả với tôi, với javascript đơn giản: stackoverflow.com/a/5767357/4681687
chimos

xem nhận xét của tôi dưới việc sử dụng splice () và $ .inArray (), tôi đã giải quyết vấn đề này mà KHÔNG sử dụng vòng lặp, và nó sạch sẽ.
dùng253780

Câu trả lời:


619

Một JSFIDDLE hoạt động

Bạn có thể làm một cái gì đó như thế này:

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

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

Kết quả:

[1, 3]

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


2
Đó là tin tốt và đúng là cần phải sửa đổi :)
Sarfraz

2
Tôi nghĩ rằng @ user113716 trả lời, liên quan đến phương thức JS mặc định là đúng cách. Bất kỳ phương pháp bản địa sẽ luôn luôn được ưa thích và nhanh hơn.
neoswf

114
Không phải câu trả lời này là hoàn toàn sai sao? Đó là tạo một mảng mới với một mục bị thiếu, không xóa một mục khỏi mảng. Chúng không giống nhau chút nào.
James Moore

5
Đó là một loại bỏ với độ phức tạp của O (n) ... càng nhiều giá trị trong mảng, điều tồi tệ nhất sẽ là ...
Lyth

2
Độ phức tạp của O (n) không phải là vấn đề.
Omar Tariq

370

Với jQuery, bạn có thể thực hiện thao tác một dòng như thế này:

Ví dụ: http://jsfiddle.net/HWKQY/

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

Sử dụng nguồn gốc .splice()và jQuery $.inArray().


13
@Elankeeran - Bạn được chào đón. : o) Tôi nên lưu ý rằng điều này sẽ chỉ loại bỏ trường hợp đầu tiên. Nếu có nhiều cái bị loại bỏ, nó sẽ không hoạt động.
dùng113716

7
Tôi cũng đã thay đổi removeItem thành một giá trị KHÔNG tồn tại trong mảng và nó đã xóa mục cuối cùng trong mảng. Sử dụng cái này nếu bạn không chắc chắn về sự tồn tại của removeItem: y = $ .grep (y, function (val) {return val! = RemoveItem;});
Solburn

52
CẢNH BÁO - Có thể xóa mục sai! $ .inArray trả về -1 nếu không có giá trị và .splice coi chỉ số âm là 'từ cuối', vì vậy nếu giá trị bạn đang cố xóa không xuất hiện, thay vào đó, một số giá trị khác sẽ bị xóa. Ngoài ra $ .grep sẽ xóa tất cả các lần xuất hiện trong khi phương thức này sẽ chỉ xóa lần đầu tiên.
Ryan Williams

1
Để khắc phục cả hai vấn đề được mô tả ở trên, hãy sử dụng whilevòng lặp và biến tạm thời như sau:var found; while ((found = $.inArray(removeItem, y)) !== -1) y.splice(found, 1);

1
Mặc dù ES5 đẹp hơn .indexOf()thay vì jQuery vì bạn có thể sử dụng chỉ mục cuối cùng được tìm thấy làm điểm bắt đầu cho tìm kiếm tiếp theo, hiệu quả hơn nhiều so với tìm kiếm toàn bộ mảng mỗi lần. var found=0; while ((found = y.indexOf(removeItem, found)) !== -1) y.splice(found, 1);

51

jQuery.filterphương pháp rất hữu ích. Điều này có sẵn cho Arraycác đối tượng.

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/

Trong 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
Có vẻ như làm việc tốt nhất trong số các giải pháp được đề xuất, mặc dù thực tế nó không làm thay đổi mảng hiện có mà là tạo ra một giải pháp mới. Nó cũng hoạt động với các giá trị không tồn tại hoặc một mảng trống. Kiểm tra hiệu năng nhanh trong JSFiddle tôi đã làm: với một mảng có 800.000 giá trị, mất khoảng 6 giây để hoàn thành. Không chắc chắn nếu đó là nhanh mặc dù.
Flo

2
Giải pháp này đang sử dụng bộ lọc hàm bậc cao vanilla JS, phương pháp bộ lọc KHÔNG phải jQuery.
Kalimah

Tôi thích nó! Có vẻ như giải pháp tốt nhất mặc dù nó không phải là trò đùa ...
Sam

36

Bạn có thể sử dụng underscore.js . Nó thực sự làm cho mọi thứ đơn giản.

Trong trường hợp của bạn, tất cả các mã mà bạn sẽ phải viết là -

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

và kết quả sẽ là [1,3].

Nó làm giảm mã mà bạn viết.


34

Không phải là một cách jQuery nhưng ... Tại sao không sử dụng cách đơn giản hơn. Xóa 'c' khỏi mảng sau

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

Bạn cũng có thể sử dụng: (Lưu ý với bản thân mình: Không sửa đổi các đối tượng bạn không sở hữu )

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']

Thêm đơn giản hơna.push('c')


9
Không hoạt động. Loại bỏ mục cuối cùng trong mảng nếu không tìm thấy.
Timothy Aaron

7
indexOf không được hỗ trợ trong IE8-.
Boude

1
Làm việc hoàn hảo, cảm ơn.
Jay Momaya

22

Xóa mục trong mảng

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)
        }
    }
}

Ví dụ về việc sử dụng

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]]

Để sử dụng chức năng nguyên mẫu này, bạn cần dán nó vào mã của mình. Sau đó, bạn có thể áp dụng nó cho bất kỳ mảng nào với 'ký hiệu dấu chấm':

someArr.remove('elem1')

Một chút giải thích sẽ không bỏ lỡ ở đây!
Gaz Winter

Để sử dụng chức năng nguyên mẫu này, bạn cần dán nó vào mã của mình. Sau đó, bạn có thể áp dụng nó cho bất kỳ mảng nào với 'ký hiệu dấu chấm', ví dụ: someArr.remove ('elem1')
yesnik

3
Vấn đề duy nhất với cái gì đó như thế này là nó ghi đè lên phương thức xóa của đối tượng Array toàn cầu, nghĩa là bất kỳ mã nào khác trong dự án phụ thuộc vào hành vi mặc định kết thúc bằng hành vi lỗi.
jmort253

2
Một vấn đề khác là biến toàn cầu ibị ghi đè.
Roland Illig


5

Bạn có thể sử dụng chức năng .not như thế này:

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

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

2
Điều này sẽ xóa sạch toàn bộ mảng nếu giá trị không có trong đó, vì vậy searchValue = 4 sẽ trả về một mảng trống.
Julian K

3
Tôi đã sao chép mã vào jsfiddle, đổi searchValuethành 4, chạy mã, không phát hiện vấn đề gì. Tất cả các giá trị vẫn còn hiện diện. @ JulianK
RST

4

Phiên bản của tôi về câu trả lời của user113716. Anh ta sẽ loại bỏ một giá trị nếu không tìm thấy kết quả khớp, điều này không tốt.

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

var i = $.inArray(removeItem,y)

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

alert(y);

Điều này hiện sẽ loại bỏ 1 mục nếu tìm thấy kết quả khớp, 0 nếu không tìm thấy kết quả khớp.

Làm thế nào nó hoạt động:

  • $ .inArray (value, mảng) là một hàm jQuery tìm chỉ mục đầu tiên của a valuetrong mộtarray
  • Giá trị trên trả về -1 nếu không tìm thấy giá trị, vì vậy hãy kiểm tra xem tôi có phải là chỉ mục hợp lệ không trước khi chúng tôi thực hiện xóa. Xóa chỉ mục -1 có nghĩa là xóa cái cuối cùng, điều này không hữu ích ở đây.
  • .splice (index, đếm) loại bỏ countsố các giá trị khởi điểm index, vì vậy chúng tôi chỉ muốn một countcủa1

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

Có một giải pháp đơn giản với mối nối. Theo cú pháp mối nối W3School là sau;

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

Chỉ số cần thiết. Một số nguyên chỉ định vị trí cần thêm / xóa các mục, Sử dụng các giá trị âm để chỉ định vị trí từ cuối mảng

bao nhiêu buộc. Số lượng các mặt hàng sẽ được gỡ bỏ. Nếu được đặt thành 0, sẽ không có mục nào bị xóa

mục1, ..., mụcX Tùy chọn. (Các) mục mới sẽ được thêm vào mảng

Hãy nhớ rằng, js sau sẽ bật một hoặc nhiều mục phù hợp từ mảng đã cho nếu tìm thấy, nếu không sẽ không xóa mục cuối cùng của mảng.

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;

Hoặc là

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

Vì vậy, trận chung kết sẽ giống như sau

x.splice( startItemIndex , itemsFound );

Hi vọng điêu nay co ich.


3

Đầu tiên kiểm tra nếu phần tử tồn tại trong mảng

$.inArray(id, releaseArray) > -1

dòng trên trả về chỉ mục của phần tử đó nếu nó tồn tại trong mảng, nếu không nó trả về -1

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

bây giờ dòng trên sẽ loại bỏ phần tử này khỏi mảng nếu tìm thấy. Tổng hợp logic dưới đây là mã cần thiết để kiểm tra và loại bỏ phần tử khỏi mảng.

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

2

Tôi đã có một nhiệm vụ tương tự khi tôi cần xóa nhiều đối tượng cùng một lúc dựa trên một thuộc tính của các đối tượng trong mảng.

Vì vậy, sau một vài lần lặp lại, tôi kết thúc với:

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

2

Tôi sẽ mở rộng lớp Array bằng một pick_and_remove()hàm, như vậy:

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

Mặc dù có vẻ hơi dài dòng, nhưng bây giờ bạn có thể gọi pick_and_remove()bất kỳ mảng nào bạn muốn!

Sử dụng:

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

Bạn có thể thấy tất cả những điều này trong hành động theo chủ đề pokemon tại đây.


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;
}  

Sau đó, bạn có thể gọi hàm bất cứ nơi nào trong mã của bạn.

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"!

Điều này hoạt động trong mọi trường hợp và tránh các vấn đề trong các phương pháp trên. Mong rằng sẽ giúp!


2

Hãy thử nó nó hoạt động với tôi

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

2

Câu trả lời được đánh giá cao thứ hai ở đây là về phương pháp gần nhất có thể đối với phương thức jQuery một lớp của hành vi dự định mà OP muốn, nhưng họ đã vấp ngã ở cuối mã của mình và nó có một lỗ hổng. Nếu mục của bạn bị xóa không thực sự nằm trong mảng, mục cuối cùng sẽ bị xóa.

Một số người đã nhận thấy vấn đề này, và một số đã đưa ra các cách để vượt qua để bảo vệ chống lại điều này. Tôi cung cấp phương pháp ngắn nhất, sạch nhất mà tôi có thể tìm thấy và tôi đã nhận xét dưới câu trả lời của họ về cách sửa mã của họ theo phương pháp này.

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);

mảng x sẽ loại bỏ phần tử "bye" một cách dễ dàng và mảng y sẽ không bị ảnh hưởng.

Việc sử dụng đối số $.inArray(removeItem,array)làm đối số thứ hai thực sự kết thúc là độ dài để ghép. Vì mục này không được tìm thấy, điều này sẽ đánh giá array.splice(-1,-1);, điều này sẽ dẫn đến kết quả là không có gì được ghép ... tất cả mà không phải viết một vòng lặp cho việc này.


1

Để xóa 2 khỏi mảng một cách an toàn bằng cách sử dụng JavaScript vanilla:

// 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]

Nguồn polyfill: Mozilla


0

Chỉ cần thêm vào câu trả lời từ Sarfraz, không ai ngờ nó đã biến nó thành một chức năng.

Sử dụng câu trả lời từ ddagsan bằng phương thức .filter nếu bạn có cùng giá trị nhiều lần trong mảng của mình.

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>

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.