Как удалить конкретное значение из массива с помощью jQuery

336

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

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

Как удалить конкретное значение из массива с помощью jQuery? Я пробовал pop(), но всегда удаляет последний элемент.

  • 7
    ВНИМАНИЕ : у некоторых ответов с наибольшим количеством голосов могут быть побочные эффекты, например, неправильные операции, когда массив не содержит удаляемого элемента. Пожалуйста, используйте их с осторожностью .
  • 0
    Этот ответ работал для меня, с простым JavaScript: stackoverflow.com/a/5767357/4681687
Теги:
arrays

17 ответов

521
Лучший ответ

Рабочий 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/

  • 0
    Спасибо Сарфразу тот же ответ, который я получил от snipplr.com/view/14381/remove-item-from-array-with-jquery Это работает сейчас! Спасибо.
  • 2
    Это хорошая новость, и да, нужная модификация была необходима :)
Показать ещё 12 комментариев
303

С помощью jQuery вы можете выполнить однострочную операцию следующим образом:

Пример: http://jsfiddle.net/HWKQY/

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

Использует собственный .splice() и jQuery $.inArray().

  • 12
    @Elankeeran - Пожалуйста. : о) Должен заметить, что это удалит только первый экземпляр. Если есть несколько, которые будут удалены, это не будет работать.
  • 7
    Я также изменил removeItem на значение, которое НЕ существует в массиве, и он удалил последний элемент в массиве. Используйте это, если вы не уверены в существовании удаленного элемента: y = $ .grep (y, function (val) {return val! = RemoveItem;});
Показать ещё 6 комментариев
32

Вы можете использовать underscore.js. Это действительно упрощает процесс.

В этом случае код, который вам нужно сделать, -

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

и результат будет [1,3].

Он уменьшает код, который вы пишете.

31

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/

В Экстракте 6:

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

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

  • 2
    Кажется, работает лучше всего из предложенных решений, хотя на самом деле это не изменение существующего массива, а создание нового. Он также работает с несуществующими значениями или пустым массивом. Я сделал быструю проверку производительности в JSFiddle: для массива с 800.000 значений потребовалось около 6 секунд. Не уверен, что это быстро, хотя.
25

Не путь 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')

  • 7
    Не работает Удаляет последний элемент в массиве, если не найден.
  • 7
    indexOf не поддерживается в IE8-.
10
//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')
  • 0
    Немного больше объяснений не пропустите здесь!
  • 0
    Чтобы использовать эту функцию-прототип, вам нужно вставить ее в свой код. Затем вы можете применить его к любому массиву с «точечной нотацией», например: someArr.remove ('elem1')
Показать ещё 2 комментария
7

Удалить элемент в массиве

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

В Javascript нет собственного способа сделать это. Вы можете использовать библиотеку или написать небольшую функцию, чтобы сделать это вместо: http://ejohn.org/blog/javascript-array-remove/

3

Вы можете использовать .not такую ​​функцию:

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

var newArr = $(arr).not([searchValue]).get();
  • 2
    Это уничтожит весь массив, если значение там отсутствует, поэтому searchValue = 4 вернет пустой массив.
  • 2
    Я скопировал код в jsfiddle, изменил searchValue на 4, запустил код, проблем не обнаружено. Все значения все еще присутствовали. @ JulianK
2
//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;
1

Существует простое решение с сращиванием. Согласно W3School последовал синтаксис сплайсинга;

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

index Требуется. Целое число, указывающее, в какую позицию добавлять/удалять элементы. Используйте отрицательные значения для указания позиции из конца массива

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

Надеюсь, что это поможет.

1
/** 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"!

Это работает во всех случаях и позволяет избежать проблем в вышеприведенных методах. Надеюсь, что это поможет!

1

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

Вы можете увидеть все это в pokemon-themed action здесь.

1

У меня была аналогичная задача, когда мне нужно было удалить сразу несколько объектов на основе свойства объектов в массиве.

Итак, после нескольких итераций я получаю:

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

Чтобы безопасно удалить 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]

Polyfill источник: Mozilla

0

Моя версия 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, которая находит первый индекс a value в array
  • Приведенное выше возвращает -1, если значение не найдено, поэтому убедитесь, что я является допустимым индексом перед удалением. Удаление индекса -1 означает удаление последнего, что здесь не помогает.
  • .splice(index, count) удаляет count количество значений, начинающихся с index, поэтому мы хотим просто count 1
-2

используя простой javascript, вы можете использовать это:

Array.remove('Valuetoberemoved'); 
ex: y.remove('2');

или это:

http://ejohn.org/blog/javascript-array-remove/

Ещё вопросы

Сообщество Overcoder
Наверх
Меню