Как удалить определенный элемент из массива в JavaScript? - PullRequest
7275 голосов
/ 24 апреля 2011

У меня есть массив Numbers, и я использую метод .push() для добавления в него элементов.

Есть ли простой способ удалить определенный элемент из массива?Эквивалент чего-то вроде array.remove(number);.

Мне нужно использовать core JavaScript - нет фреймворки разрешены.

Ответы [ 79 ]

14 голосов
/ 26 сентября 2013
  Array.prototype.removeItem = function(a) {
            for (i = 0; i < this.length; i++) {
                if (this[i] == a) {
                    for (i2 = i; i2 < this.length - 1; i2++) {
                        this[i2] = this[i2 + 1];
                    }
                    this.length = this.length - 1
                    return;
                }
            }
        }

    var recentMovies = ['Iron Man', 'Batman', 'Superman', 'Spiderman'];
    recentMovies.removeItem('Superman');
13 голосов
/ 08 января 2019

Удаление определенного элемента / строки из массива может быть выполнено в один слой: Я до сих пор думаю, что это самый элегантный вкладыш, который вы можете получить для такого типа проблемы:

theArray.splice(theArray.indexOf("stringToRemoveFromArray"), 1);

, где theArray - это массив, из которого вы хотите удалить что-то конкретное, stringToRemoveFromArray - это строка, которую вы хотите удалить, и 1 - это количество элементов, которые вы хотите удалить.

13 голосов
/ 12 мая 2017

Удалить по индексу

Функция, которая возвращает копию массива без элемента с индексом.

/**
* removeByIndex
* @param {Array} array
* @param {Number} index
*/
function removeByIndex(array, index){
    return array.filter(function(elem, _index){
        return index != _index;
    });
}
l = [1,3,4,5,6,7];
console.log(removeByIndex(l, 1));

$> [ 1, 4, 5, 6, 7 ]

Удалить по значению

Функция, которая возвращает копию массива без значения.

/**
* removeByValue
* @param {Array} array
* @param {Number} value
*/
function removeByValue(array, value){
    return array.filter(function(elem, _index){
        return value != elem;
    });
}
l = [1,3,4,5,6,7];
console.log(removeByValue(l, 5));

$> [ 1, 3, 4, 6, 7]
11 голосов
/ 07 августа 2013

Создать новый массив:

var my_array = new Array();

Добавить элементы в этот массив:

my_array.push("element1");

Функция indexOf (возвращает индекс или -1, если не найден):

var indexOf = function(needle) 
{
    if(typeof Array.prototype.indexOf === 'function') // newer browsers
    {
        indexOf = Array.prototype.indexOf;
    } 
    else // older browsers
    {
        indexOf = function(needle) 
        {
            var index = -1;

            for(var i = 0; i < this.length; i++) 
            {
                if(this[i] === needle) 
                {
                    index = i;
                    break;
                }
            }
            return index;
        };
    }

    return indexOf.call(this, needle);
};

Проверить индекс этого элемента (протестировано с Firefox и IE8 +):

var index = indexOf.call(my_array, "element1");

Удалить 1 элемент, расположенный по индексу, из массива

my_array.splice(index, 1);
10 голосов
/ 08 октября 2013

Я также столкнулся с ситуацией, когда мне пришлось удалить элемент из Array. .indexOf не работал в IE*, поэтому поделился своим рабочим jQuery.inArray() решением.

var index = jQuery.inArray(val,arr);
if (index > -1) {
    arr.splice(index, 1);
    //console.log(arr);
}
9 голосов
/ 08 мая 2017

2017-05-08

Большинство приведенных ответов работают для строгого сравнения. Это означает, что оба объекта ссылаются на один и тот же объект в памяти (или являются примитивными типами), но часто вы хотите удалить не примитивный объект из массива с определенным значением. , Например, если вы звоните на сервер и хотите проверить полученный объект по локальному объекту.

const a = {'field': 2} // Non-primitive object
const b = {'field': 2} // Non-primitive object with same value
const c = a            // Non-primitive object that reference the same object as "a"

assert(a !== b) // Don't reference the same item, but have same value
assert(a === c) // Do reference the same item, and have same value (naturally)

//Note: there are many alternative implementations for valuesAreEqual
function valuesAreEqual (x, y) {
   return  JSON.stringify(x) === JSON.stringify(y)
}


//filter will delete false values
//Thus, we want to return "false" if the item
// we want to delete is equal to the item in the array
function removeFromArray(arr, toDelete){
    return arr.filter(target => {return !valuesAreEqual(toDelete, target)})
}

const exampleArray = [a, b, b, c, a, {'field': 2}, {'field': 90}];
const resultArray = removeFromArray(exampleArray, a);

//resultArray = [{'field':90}]

Существуют альтернативные / более быстрые реализации для valuesAreEqual, но это делает работу. Вы также можете использовать пользовательский компаратор, если у вас есть определенное поле для проверки (например, некоторые извлеченные UUID против локального UUID).

Также обратите внимание, что это функциональная операция, то есть она не изменяет исходный массив.

9 голосов
/ 07 мая 2016

Я думаю, что многие инструкции JavaScript плохо продуманы для функционального программирования.Splice возвращает удаленный элемент, где в большинстве случаев вам нужен уменьшенный массив.Это плохо.

Представьте, что вы делаете рекурсивный вызов и вам необходимо передать массив с одним элементом меньше, возможно, без текущего индексированного элемента.Или представьте, что вы делаете другой рекурсивный вызов и должны передать массив с нажатым элементом.

Ни в одном из этих случаев вы не можете сделать myRecursiveFunction(myArr.push(c)) или myRecursiveFunction(myArr.splice(i,1)).Первый идиот фактически передаст длину массива, а второй идиот передаст удаленный элемент в качестве параметра.

Итак, что я делаю на самом деле ... Для удаления элемента массива и передачи полученного значения вфункцию в качестве параметра в то же время я делаю следующим образом

myRecursiveFunction(myArr.slice(0,i).concat(a.slice(i+1)))

Когда дело касается толчка, это более глупо ... Мне нравится,

myRecursiveFunction((myArr.push(c),myArr))

Я верю вВ надлежащем функциональном языке метод, изменяющий объект, к которому он вызван, должен возвращать ссылку на сам объект в результате.

8 голосов
/ 30 января 2014

В CoffeeScript :

my_array.splice(idx, 1) for ele, idx in my_array when ele is this_value
8 голосов
/ 24 апреля 2019
[2,3,5].filter(i => ![5].includes(i))
7 голосов
/ 17 сентября 2014

Используйте InArray в jQuery:

A = [1, 2, 3, 4, 5, 6];
A.splice($.inArray(3, A), 1);
//It will return A=[1, 2, 4, 5, 6]`   

Примечание: inArray вернет -1, если элемент не был найден.

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