Как удалить элемент из массива по значению? - PullRequest
778 голосов
/ 17 октября 2010

Есть ли способ удалить элемент из массива JavaScript?

Учитывая массив:

var ary = ['three', 'seven', 'eleven'];

Я хотел бы сделать что-то вроде:

removeItem('seven', ary);

Я посмотрел на splice(), но это удаляет только по номеру позиции, тогда как мне нужно что-то, чтобы удалить элемент по его значению.

Ответы [ 35 ]

1347 голосов
/ 17 октября 2010

Вы можете использовать indexOf метод , например, так:

var index = array.indexOf(item);
if (index !== -1) array.splice(index, 1);

Примечание : Вам нужно будет подложить егодля IE8 и ниже

var array = [1,2,3,4]
var item = 3

var index = array.indexOf(item);
if (index !== -1) array.splice(index, 1);

console.log(array)
432 голосов
/ 18 октября 2010

Это может быть глобальная функция или метод пользовательского объекта, если вам не разрешено добавлять к собственным прототипам.Он удаляет все элементы из массива, которые соответствуют любому из аргументов.

Array.prototype.remove = function() {
    var what, a = arguments, L = a.length, ax;
    while (L && this.length) {
        what = a[--L];
        while ((ax = this.indexOf(what)) !== -1) {
            this.splice(ax, 1);
        }
    }
    return this;
};

var ary = ['three', 'seven', 'eleven'];

ary.remove('seven');

/*  returned value: (Array)
three,eleven
*/

Чтобы сделать его глобальным -

function removeA(arr) {
    var what, a = arguments, L = a.length, ax;
    while (L > 1 && arr.length) {
        what = a[--L];
        while ((ax= arr.indexOf(what)) !== -1) {
            arr.splice(ax, 1);
        }
    }
    return arr;
}
var ary = ['three', 'seven', 'eleven'];
removeA(ary, 'seven');


/*  returned value: (Array)
three,eleven
*/

И заботиться о IE8 и ниже-

if(!Array.prototype.indexOf) {
    Array.prototype.indexOf = function(what, i) {
        i = i || 0;
        var L = this.length;
        while (i < L) {
            if(this[i] === what) return i;
            ++i;
        }
        return -1;
    };
}
334 голосов
/ 29 декабря 2013

Однострочник сделает это,

var ary = ['three', 'seven', 'eleven'];

// Remove item 'seven' from array
var filteredAry = ary.filter(function(e) { return e !== 'seven' })
//=> ["three", "eleven"]

// In ECMA6 (arrow function syntax):
var filteredAry = ary.filter(e => e !== 'seven')

Используется функция фильтра в JS. Поддерживается в IE9 и выше.

Что он делает (из ссылки на документацию)

filter () вызывает предоставленную функцию обратного вызова один раз для каждого элемента в массиве и создает новый массив из всех значений, для которых обратный вызов возвращает значение, которое приводит к значению true. обратный вызов вызывается только для индексов массива, которым присвоены значения; он не вызывается для индексов, которые были удалены или которым никогда не присваивались значения. Элементы массива, которые не проходят тест обратного вызова, просто пропускаются и не включаются в новый массив.

Таким образом, по сути, это то же самое, что и все другие решения for (var key in ary) { ... }, за исключением того, что конструкция for in поддерживается начиная с IE6.

По сути, фильтр - это удобный метод, который выглядит намного лучше (и является цепным) в отличие от конструкции for in (AFAIK).

130 голосов
/ 19 февраля 2013

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

Например, с этим:

var result = _.without(['three','seven','eleven'], 'seven');

И result будет ['three','eleven'].

В вашем случае код, который выпридется написать это:

ary = _.without(ary, 'seven')

Это сокращает код, который вы пишете.

50 голосов
/ 17 июля 2011

Проверить таким образом:

for(var i in array){
    if(array[i]=='seven'){
        array.splice(i,1);
        break;
    }
}

и в функции:

function removeItem(array, item){
    for(var i in array){
        if(array[i]==item){
            array.splice(i,1);
            break;
        }
    }
}

removeItem(array, 'seven');
35 голосов
/ 12 июля 2013

Вот версия, которая использует функцию jQuery inArray :

var index = $.inArray(item, array);
if (index != -1) {
    array.splice(index, 1);
}
31 голосов
/ 26 декабря 2017

Вы можете сделать это двумя способами:

var arr = ["1","2","3","4"] // we wanna delete number "3"

первый:

arr.indexOf('3') !== -1 && arr.splice(arr.indexOf('3'), 1)

второй (ES6):

arr = arr.filter(e => e !== '3')
28 голосов
/ 13 ноября 2012
var index = array.indexOf('item');

if(index!=-1){

   array.splice(index, 1);
}
16 голосов
/ 24 августа 2014

То, что вы ищете, это фильтр

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter

Это позволит вам сделать следующее:

var ary = ['three', 'seven', 'eleven'];
var aryWithoutSeven = ary.filter(function(value) { return value != 'seven' });
console.log(aryWithoutSeven); // returns ['three', 'eleven']

Это также было отмечено в этой темегде-то еще: https://stackoverflow.com/a/20827100/293492

11 голосов
/ 26 июня 2017

Видя, что это не красиво, вот простая и многократно используемая функция ES6.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...