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

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

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

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

Ответы [ 79 ]

3 голосов
/ 31 июля 2017

Опубликовать мой код, который удаляет элемент массива на месте, а также уменьшает длину массива.

function removeElement(idx, arr) {
    // check the index value
    if (idx < 0 || idx >= arr.length) {
        return;
    }
    // shift the elements
    for (var i = idx; i > 0; --i) {
        arr[i] = arr[i - 1];
    }
    // remove the first element in array
    arr.shift();
}
2 голосов
/ 22 октября 2014

Удаление значения с индексом и сращиванием!

function removeArrValue(arr,value) {
    var index = arr.indexOf(value);
    if (index > -1) {
        arr.splice(index, 1);
    }
    return arr;
}
2 голосов
/ 15 ноября 2015

Следующий метод удалит все записи данного значения из массива без создания нового массива и только с одной итерацией, которая сверхбыстрая . И он работает в древнем браузере Internet Explorer 5.5 :

function removeFromArray(arr, removeValue) {
  for (var i = 0, k = 0, len = arr.length >>> 0; i < len; i++) {
    if (k > 0)
      arr[i - k] = arr[i];

    if (arr[i] === removeValue)
      k++;
  }

  for (; k--;)
    arr.pop();
}

var a = [0, 1, 0, 2, 0, 3];

document.getElementById('code').innerHTML =
  'Initial array [' + a.join(', ') + ']';
//Initial array [0, 1, 0, 2, 0, 3]

removeFromArray(a, 0);

document.getElementById('code').innerHTML +=
  '<br>Resulting array [' + a.join(', ') + ']';
//Resulting array [1, 2, 3]
<code id="code"></code>
2 голосов
/ 24 ноября 2017

Как жаль, что у вас есть массив целых чисел, а не объект, ключи которого являются строковыми эквивалентами этих целых чисел.

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

Поправьте меня, если я ошибаюсь, но разве мы не можем предположить, что на карте key => value, подобной объекту JS, можно предположить, что механизм поиска ключа является высоко разработанным и оптимизированным? (Примечание: если какой-нибудь супер-эксперт скажет мне, что это не так, я могу предложить вместо этого использовать ES6 Map class , что, безусловно, будет).

Я просто предполагаю, что при определенных обстоятельствах лучшим решением может быть преобразование вашего массива в объект ... проблема, конечно, в том, что у вас могут быть повторяющиеся целочисленные значения. Я предлагаю помещать их в ведра как часть «value» записей key => value. (NB, если вы уверены, что у вас нет повторяющихся элементов массива, это может быть гораздо проще: значения «такие же как» у ключей, и просто наберите Object.values(...), чтобы вернуть ваш измененный массив).

Чтобы вы могли сделать:

const arr = [ 1, 2, 55, 3, 2, 4, 55 ];
const f =   function( acc, val, currIndex ){ 
    // not seen this val before: make bucket... NB although val's typeof is 'number'
    // there is seamless equivalence between the object key (always string)
    // and this variable val 
    ! ( val in acc ) ? acc[ val ] = []: 0;
    // drop another array index in the bucket
    acc[ val ].push( currIndex );
    return acc; 
}
const myIntsMapObj = arr.reduce( f, {});

console.log( myIntsMapObj );

выход:

Объект [<1 пустое место>, Массив 1 , Массив [2], Массив 1 , Массив 1 , <5 пустые слоты>, еще 46…]

тогда легко удалить все цифры 55

delete myIntsMapObj[ 55 ]; // again, although keys are strings this works

Вам не нужно удалять их все: значения индексов помещаются в их сегменты в порядке их появления, поэтому (например):

myIntsMapObj[ 55 ].shift(); // and
myIntsMapObj[ 55 ].pop(); 

удалит первое и последнее вхождение соответственно. Вы можете легко рассчитать частоту появления, заменить все 55 с 3 с, передав содержимое одного контейнера в другое и т. Д.

... возврат вашего измененного массива int немного сложен: но каждый сегмент содержит индекс (в исходном массиве) значения, представленного ключом (string). Каждое из этих значений сегмента также уникально: таким образом, вы превращаете их в ключи в новом объекте, используя (действительное) целое число из «целочисленного строкового ключа» в качестве значения ... затем сортируете ключи и идете Object.values( ... ).

Это звучит очень сложно и отнимает много времени ... но, очевидно, все зависит от обстоятельств и желаемого использования. Насколько я понимаю, все версии и контексты JS работают только в одном потоке, и поток не «отпускает», поэтому может возникнуть какая-то ужасная перегрузка с помощью метода «грубой силы»: не столько из-за indexOf ops, но многократное повторение slice / splice ops.

Добавление
Если вы уверены , это слишком много для вашего варианта использования, несомненно, самый простой подход "грубой силы" -

const arr = [ 1, 2, 3, 66, 8, 2, 3, 2 ];
const newArray = arr.filter( number => number !== 3 );
console.log( newArray )

(да, другие ответы заметили Array.prototype.filter ...)

2 голосов
/ 12 сентября 2018

Я сам столкнулся с этой проблемой (в ситуации, когда замена массива была приемлемой) и решил ее с помощью простого:

var filteredItems = this.items.filter(function (i) {
    return i !== item;
});

Чтобы дать приведенному фрагменту немного контекста:

self.thingWithItems = {
        items: [],
        removeItem: function (item) {
            var filteredItems = this.items.filter(function (i) {
                return i !== item;
            });

            this.items = filteredItems;
        }
    };

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

2 голосов
/ 27 января 2019

Чтобы удалить конкретный элемент или последующие элементы, метод Array.splice () работает хорошо.Метод splice () изменяет содержимое массива, удаляя или заменяя существующие элементы и / или добавляя новые элементы, и возвращает удаленные элементы.

Синтаксис: array.splice (index, deleteCount, item1, ....., itemX)

Здесь index является обязательным, а остальные аргументы необязательными.

Например:

let arr = [1, 2, 3, 4, 5, 6];
arr.splice(2,1);
console.log(arr);
// [1, 2, 4, 5, 6]

Примечание: Метод Array.splice () можно использовать, если вы знаете индекс элемента, который хотите удалить.Но у нас может быть еще несколько случаев, как указано ниже -

  1. Если вы хотите удалить только последний элемент, вы можете использовать Array.pop ()

  2. Если вы хотите удалить только первый элемент, вы можете использовать Array.shift ()

  3. Если вы знаетеэлемент, но не позиция (или индекс) элемента, и хотите удалить все соответствующие элементы, используя Array.filter () метод:

    let arr = [1, 2, 1, 3, 4, 1, 5, 1];
    
    let newArr = arr.filter(function(val){
        return val !== 1;
     });
     //newArr => [2, 3, 4, 5]
    

ИЛИ используя метод splice () as-

let arr = [1, 11, 2, 11, 3, 4, 5, 11, 6, 11];
    for( let i = 0; i < arr.length-1; i++){
       if ( arr[i] === 11) {
         arr.splice(i, 1); 
       }
    }
    console.log(arr);
    // [1, 2, 3, 4, 5, 6]

ИЛИ предположим, что мы хотим удалить del из массива Arr:

let arr = [1, 2, 3, 4, 5, 6];
let del = 4;
if(arr.indexOf(4) >= 0) {
arr.splice(arr.indexOf(4), 1)
}

ИЛИ

let del = 4;
for(var i = arr.length - 1; i >= 0; i--) {
    if(arr[i] === del) {
       arr.splice(i, 1);
    }
}

Если вы знаете только один элемент, но не знаете его позицию (или индекс) и хотите удалить только самый первый соответствующий элемент, используя метод splice ():

let arr = [1, 11, 2, 11, 3, 4, 5, 11, 6, 11];

for( let i = 0; i < arr.length-1; i++){
  if ( arr[i] === 11) {
    arr.splice(i, 1);
    break;
  }
}
console.log(arr);
// [1, 11, 2, 11, 3, 4, 5, 11, 6, 11]
2 голосов
/ 26 июня 2014
var index,
    input = [1,2,3],
    indexToRemove = 1;
    integers = [];

for (index in input) {
    if (input.hasOwnProperty(index)) {
        if (index !== indexToRemove) {
            integers.push(result); 
        }
    }
}
input = integers;

Это решение будет принимать массив входных данных и будет искать во входных данных значение, которое нужно удалить. Это будет проходить по всему входному массиву, и результатом будут целые числа второго массива, у которых был удален определенный индекс. Затем массив целых чисел копируется обратно во входной массив.

1 голос
/ 05 февраля 2019

Сращивание, фильтрация и удаление для удаления элемента из массива

Каждый массив имеет свой индекс, и это помогает удалить определенный элемент с их индексом.

Метод соединения ()

array.splice (index, 1 ); 1-й параметр - индекс, а второй - номер элемента, который вы

хотите удалить из этого индекса.

Так что для одного элемента мы используем 1.

Метод удаления

удалить массив [index]

Метод filter ()

Если вы хотите удалить элемент, который повторяется в массиве, отфильтруйте массив.

removeAll = array.filter (e => e! = Elem);

где elem - элемент, который вы хотите удалить из массива, а array - имя вашего массива

1 голос
/ 26 ноября 2014

Если вам требуется поддержка более старых версий Internet Explorer, я рекомендую использовать следующий полифилл (примечание: это , а не фреймворк). Это 100% обратно совместимая замена всех современных методов массива (JavaScript 1.8.5 / ECMAScript 5 Array Extras), которая работает для Internet Explorer 6+, Firefox 1.5+, Chrome, Safari и Opera.

https://github.com/plusdude/array-generics

1 голос
/ 13 мая 2018

Определите метод с именем remove () для объектов массива, используя функцию прототипирования JavaScript.

Используйте метод splice () , чтобы выполнить ваше требование.

Пожалуйста, ознакомьтесь с кодом ниже.

Array.prototype.remove = function(item) {
    // index will have -1 if item does not exist
    // else it will have the index of 1st item found in array
    var index = this.indexOf(item); 

    if (index > -1) {
        // splice() method is used to add/remove items(s) in array
        this.splice(index, 1); 
    }

    return index;
}


var arr = [ 11, 22, 67, 45, 61, 89, 34, 12, 7, 8, 3, -1, -4];

// Printing array
// [ 11, 22, 67, 45, 61, 89, 34, 12, 7, 8, 3, -1, -4];
console.log(arr)

// Removing 67 (getting its index i.e. 2)
console.log("Removing 67")
var index = arr.remove(67)

if (index > 0){
    console.log("Item 67 found at ", index)
} else {
    console.log("Item 67 does not exist in array")
}

// Printing updated array
// [ 11, 22, 45, 61, 89, 34, 12, 7, 8, 3, -1, -4];
console.log(arr)

// ............... Output ................................
// [ 11, 22, 67, 45, 61, 89, 34, 12, 7, 8, 3, -1, -4 ]
// Removing 67
// Item 67 found at  2
// [ 11, 22, 45, 61, 89, 34, 12, 7, 8, 3, -1, -4 ]

Примечание: Ниже приведен полный пример кода, выполняемого на Node.js REPL , который описывает использование push (), pop (), shift (), unshift () и методы splice ().

> // Defining an array
undefined
> var arr = [12, 45, 67, 89, 34, 12, 7, 8, 3, -1, -4, -11, 0, 56, 12, 34];
undefined
> // Getting length of array
undefined
> arr.length;
16
> // Adding 1 more item at the end i.e. pushing an item
undefined
> arr.push(55);
17
> arr
[ 12, 45, 67, 89, 34, 12, 7, 8, 3, -1, -4, -11, 0, 56, 12, 34, 55 ]
> // Popping item from array (i.e. from end)
undefined
> arr.pop()
55
> arr
[ 12, 45, 67, 89, 34, 12, 7, 8, 3, -1, -4, -11, 0, 56, 12, 34 ]
> // Remove item from beginning
undefined
> arr.shift()
12
> arr
[ 45, 67, 89, 34, 12, 7, 8, 3, -1, -4, -11, 0, 56, 12, 34 ]
> // Add item(s) at beginning
undefined
> arr.unshift(67); // Add 67 at begining of the array and return number of items in updated/new array
16
> arr
[ 67, 45, 67, 89, 34, 12, 7, 8, 3, -1, -4, -11, 0, 56, 12, 34 ]
> arr.unshift(11, 22); // Adding 2 more items at the beginning of array
18
> arr
[ 11, 22, 67, 45, 67, 89, 34, 12, 7, 8, 3, -1, -4, -11, 0, 56, 12, 34 ]
>
> // Define a method on array (temorarily) to remove an item and return the index of removed item; if it is found else return -1
undefined
> Array.prototype.remove = function(item) {
... var index = this.indexOf(item);
... if (index > -1) {
..... this.splice(index, 1); // splice() method is used to add/remove items in array
..... }
... return index;
... }
[Function]
>
> arr
[ 11, 22, 67, 45, 67, 89, 34, 12, 7, 8, 3, -1, -4, -11, 0, 56, 12, 34 ]
>
> arr.remove(45);   // Remove 45 (You will get the index of removed item)
3
> arr
[ 11, 22, 67, 67, 89, 34, 12, 7, 8, 3, -1, -4, -11, 0, 56, 12, 34 ]
>
> arr.remove(22)    // Remove 22
1
> arr
[ 11, 67, 67, 89, 34, 12, 7, 8, 3, -1, -4, -11, 0, 56, 12, 34 ]
> arr.remove(67)    // Remove 67
1
> arr
[ 11, 67, 89, 34, 12, 7, 8, 3, -1, -4, -11, 0, 56, 12, 34 ]
>
> arr.remove(89)    // Remove 89
2
> arr
[ 11, 67, 34, 12, 7, 8, 3, -1, -4, -11, 0, 56, 12, 34 ]
>
> arr.remove(100);  // 100 doesn't exist, remove() will return -1
-1
>

Спасибо.

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