Як видалити конкретне значення з масиву за допомогою jQuery


419

У мене є масив, який виглядає приблизно так: var y = [1, 2, 3];

Я хотів би видалити 2з масиву y.

Як я можу видалити певне значення з масиву за допомогою jQuery? Я спробував, pop()але це завжди видаляє останній елемент.


8
ПОПЕРЕДЖЕННЯ : деякі найактуативніші відповіді можуть мати побічні ефекти, наприклад, робити неправильні операції, коли масив не містить елемента, який потрібно видалити. Будь ласка, використовуйте їх обережно .
Рікардо

Ця відповідь працював для мене, з простої JavaScript: stackoverflow.com/a/5767357/4681687
chimos

дивіться мій коментар під використанням splice () та $ .inArray (), я вирішив цю проблему БЕЗ використання циклу, і він чистий.
користувач253780

Відповіді:


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
Це гарна новина, і так потрібна правильна модифікація :)
Сарфраз

2
Я думаю, що відповідь @ user113716 щодо методу JS за замовчуванням - це правильний шлях. Будь-який нативний метод завжди буде кращим і швидшим.
neoswf

114
Хіба ця відповідь не зовсім помилкова? Це створює новий масив з відсутнім елементом, а не видаляє елемент з масиву. Це зовсім не те саме.
Джеймс Мур

5
Це видалення зі складністю O (n) ... чим більше значень у масиві, тим гірше буде ...
Lyth

2
Складність O (n) не є проблемою.
Омар Тарік,

370

За допомогою jQuery ви можете виконати однолінійну операцію так:

Приклад: http://jsfiddle.net/HWKQY/

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

Використовує рідну .splice()та jQuery $.inArray().


13
@Elankeeran - ласкаво просимо. : o) Зауважу, що це видалить лише перший екземпляр. Якщо їх буде видалено кілька, це не працює.
користувач113716

7
Я також змінив deleteItem на значення, яке НЕ існує в масиві, і він видалив останній елемент з масиву. Використовуйте це, якщо ви не впевнені в існуванні RemoveItem: y = $ .grep (y, function (val) {return val! = DeleteItem;});
Солберн

52
УВАГА - Може видалити неправильний предмет! $ .inArray повертає -1, якщо значення немає, і .splice розглядає негативний індекс як "з кінця", тому якщо значення, яке ви намагаєтеся видалити, немає, замість нього буде видалено якесь інше значення. Також $ .grep видалить усі події, тоді як цей метод видалить лише перший.
Райан Вільямс

1
Щоб виправити обидві проблеми, описані вище, використовуйте whileцикл і тимчасову змінну на зразок цієї:var found; while ((found = $.inArray(removeItem, y)) !== -1) y.splice(found, 1);

1
Хоча з ES5 набагато приємніше .indexOf()замість jQuery, тому що ви можете використовувати останній індекс, знайдений як вихідну для наступного пошуку, що набагато ефективніше, ніж кожен раз шукати весь масив. 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 секунд. Не впевнений, чи швидко це все-таки.
Фло

2
Для цього рішення використовується фільтр високого порядку ванілі JS, а не метод фільтра jQuery.
Kalimah

Я це люблю! Це здається найкращим рішенням, хоча це не jquery ...
Сем

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
Не працює. Видаляє останній елемент з масиву, якщо його не знайдено.
Тимофій Аарон

7
indexOf не підтримується в IE8-.
Буде

1
Працювали чудово, дякую.
Джей Момая

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

Щоб використовувати цю функцію прототипу, вам потрібно вставити її у свій код. Тоді ви можете застосувати його до будь-якого масиву за допомогою 'nota notation':

someArr.remove('elem1')

Трохи більше пояснення не буде пропускати тут!
Газ зима

Щоб використовувати цю функцію прототипу, вам потрібно вставити її у свій код. Тоді ви можете застосувати його до будь-якого масиву за допомогою 'nota notation', наприклад: someArr.remove ('elem1')
yesnik

3
Єдина проблема у чомусь подібному - це перезапис методу видалення глобального об'єкта Array, тобто будь-який інший код у проекті, який залежить від поведінки за замовчуванням, закінчується помилковою поведінкою.
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 поверне порожній масив.
Джуліян К

3
Я скопіював код у jsfiddle, змінив searchValueна 4, запустив код, проблеми не виявлено. Усі значення все ще були присутні. @ JulianK
RST

4

Моя версія відповіді користувача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, якщо не знайдено відповідності.

Як це працює:

  • $ .InArray (значення, масив) представляє собою функцію , яка знаходить 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)

обов'язковий індекс Ціле число, яке вказує, в яку позицію додавати / видаляти елементи. Використовувати негативні значення, щоб вказати позицію з кінця масиву

як багато необхідних. Кількість елементів, які потрібно вилучити. Якщо встановлено 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

Я б розширив клас 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]

Ви можете побачити все це в акції з темою покемон тут.


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

Друга найбільш сприйнята тут відповідь - це найближчий шлях до однолінійного методу 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);, що призведе до того , що нічого не буде сплановано ... все без того, щоб написати цикл для цього.


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


0

Просто для додання відповіді від Сарфраз, здивований, ніхто ще не ввійшов у функцію.

Використовуйте відповідь від 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>

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.