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ỏ 2
khỏ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.
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ỏ 2
khỏ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.
Câu trả lời:
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/
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()
.
while
vòng lặp và biến tạm thời như sau:var found; while ((found = $.inArray(removeItem, y)) !== -1) y.splice(found, 1);
jQuery.filter
phương pháp rất hữu ích. Điều này có sẵn cho Array
cá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);
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.
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')
Xóa mục trong mảng
var arr = ["jQuery", "JavaScript", "HTML", "Ajax", "Css"];
var itemtoRemove = "HTML";
arr.splice($.inArray(itemtoRemove, arr), 1);
//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')
i
bị ghi đè.
Không có cách riêng để làm điều này trong Javascript. Bạn có thể sử dụng thư viện hoặc viết một hàm nhỏ để thực hiện việc này thay vào đó: http://ejohn.org/blog/javascript-array-remove/
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();
searchValue
thà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
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:
value
trong mộtarray
count
số các giá trị khởi điểm index
, vì vậy chúng tôi chỉ muốn một count
của1
//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;
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.
Đầ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);
}
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 });
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.
/** 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!
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`},
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.
Để 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
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>