У мене є масив, який виглядає приблизно так: var y = [1, 2, 3];
Я хотів би видалити 2
з масиву y
.
Як я можу видалити певне значення з масиву за допомогою jQuery? Я спробував, pop()
але це завжди видаляє останній елемент.
У мене є масив, який виглядає приблизно так: var y = [1, 2, 3];
Я хотів би видалити 2
з масиву y
.
Як я можу видалити певне значення з масиву за допомогою jQuery? Я спробував, pop()
але це завжди видаляє останній елемент.
Відповіді:
Працюючий 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/
За допомогою jQuery ви можете виконати однолінійну операцію так:
Приклад: http://jsfiddle.net/HWKQY/
y.splice( $.inArray(removeItem, y), 1 );
Використовує рідну .splice()
та jQuery $.inArray()
.
while
цикл і тимчасову змінну на зразок цієї:var found; while ((found = $.inArray(removeItem, y)) !== -1) y.splice(found, 1);
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);
Ви можете використовувати underscore.js . Це дійсно робить прості речі.
У вашому випадку весь код, який вам доведеться написати -
_.without([1,2,3], 2);
і результат буде [1,3].
Це зменшує код, який ви пишете.
Не спосіб 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')
//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]]
Щоб використовувати цю функцію прототипу, вам потрібно вставити її у свій код. Тоді ви можете застосувати його до будь-якого масиву за допомогою 'nota notation':
someArr.remove('elem1')
i
стає перезаписаною.
Немає рідного способу зробити це в JavaScript. Ви можете використовувати бібліотеку або написати невелику функцію, щоб зробити це замість цього: http://ejohn.org/blog/javascript-array-remove/
Ви можете використовувати .not функцію, як це:
var arr = [ 1 , 2 , 3 , 5 , 8];
var searchValue = 2;
var newArr = $(arr).not([searchValue]).get();
searchValue
на 4, запустив код, проблеми не виявлено. Усі значення все ще були присутні. @ JulianK
Моя версія відповіді користувача113716 Його вилучає значення, якщо не знайдено відповідності, що не є добре.
var y = [1, 2, 3]
var removeItem = 2;
var i = $.inArray(removeItem,y)
if (i >= 0){
y.splice(i, 1);
}
alert(y);
Тепер це видаляє 1 елемент, якщо збіг не знайдено, 0, якщо не знайдено відповідності.
Як це працює:
value
вarray
count
кількість значень, починаючи з index
, тому ми просто хочемо count
з1
//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;
Існує просте рішення зі сплайсом. Відповідно до синтаксису сплайсингу W3School слід;
array.splice(index, howmany, item1, ....., itemX)
обов'язковий індекс Ціле число, яке вказує, в яку позицію додавати / видаляти елементи. Використовувати негативні значення, щоб вказати позицію з кінця масиву
як багато необхідних. Кількість елементів, які потрібно вилучити. Якщо встановлено 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 );
Сподіваюсь, це допомагає.
Спочатку перевіряється, чи існує елемент у масиві
$.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);
}
У мене було подібне завдання, коли мені потрібно було видалити відразу кілька об'єктів на основі властивості об'єктів у масиві.
Тож після кількох ітерацій я закінчую:
list = $.grep(list, function (o) { return !o.IsDeleted });
Я б розширив клас Array за допомогою pick_and_remove()
функції, наприклад:
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]
Ви можете побачити все це в акції з темою покемон тут.
/** 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"!
Це працює у всіх випадках і дозволяє уникнути проблем у вищеописаних методах. Сподіваюся, що це допомагає!
Спробуйте це працює для мене
_clientsSelected = ["10", "30", "12"];
function (removeItem) {
console.log(removeItem);
_clientsSelected.splice($.inArray(removeItem, _clientsSelected), 1);
console.log(_clientsSelected);
`enter code here`},
Друга найбільш сприйнята тут відповідь - це найближчий шлях до однолінійного методу 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 легко видалить елемент "до побачення", а масив y буде недоторканим.
Використання аргументу $.inArray(removeItem,array)
як другого аргументу фактично закінчується довжиною до сплайсингу. Оскільки елемент не знайдено, це оцінюється до array.splice(-1,-1);
, що призведе до того , що нічого не буде сплановано ... все без того, щоб написати цикл для цього.
Щоб безпечно видалити 2 з масиву за допомогою ванільного JavaScript:
// 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
Просто для додання відповіді від Сарфраз, здивований, ніхто ще не ввійшов у функцію.
Використовуйте відповідь від ddagsan, використовуючи метод .filter, якщо ви маєте одне і те ж значення більше ніж один раз у своєму масиві.
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>