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

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

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

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

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

removeItem('seven', ary);

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

Ответы [ 35 ]

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

indexOf является опцией, но ее реализация в основном ищет значение во всем массиве, поэтому время выполнения увеличивается с размером массива. (так что в каждом браузере, я думаю, я проверял только Firefox).

У меня нет IE6 для проверки, но я бы назвал это безопасной ставкой, что вы можете проверять по крайней мере миллион элементов массива в секунду таким образом практически на любой клиентской машине. Если [размер массива] * [число запросов в секунду] может превысить миллион, вам следует рассмотреть другую реализацию.

Как правило, вы можете использовать объект для создания индекса для вашего массива, например:

var index={'three':0, 'seven':1, 'eleven':2};

Любая нормальная среда JavaScript создаст поисковый индекс для таких объектов, чтобы вы могли быстро преобразовать ключ в значение независимо от того, сколько свойств у объекта.

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

3 голосов
/ 17 марта 2015

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

var deleteMe = function( arr, me ){
   var i = arr.length;
   while( i-- ) if(arr[i] === me ) arr.splice(i,1);
}

var arr = ["orange","red","black", "orange", "white" , "orange" ];

deleteMe( arr , "orange");

обр. Теперь [«красный», «черный», «белый»]

2 голосов
/ 13 января 2016

Вы можете использовать without или pull из Lodash :

const _ = require('lodash');
_.without([1, 2, 3, 2], 2); // -> [1, 3]
2 голосов
/ 25 июня 2016

Неразрушающее удаление:

function removeArrayValue(array, value)
{
    var thisArray = array.slice(0); // copy the array so method is non-destructive

    var idx = thisArray.indexOf(value); // initialise idx

    while(idx != -1)
    {
        thisArray.splice(idx, 1); // chop out element at idx

        idx = thisArray.indexOf(value); // look for next ocurrence of 'value'
    }

    return thisArray;
}
1 голос
/ 05 мая 2014

Пожалуйста, не используйте вариант с delete - он делает дыру в массиве, поскольку не переиндексирует элементы после удаленного элемента.

> Array.prototype.remove=function(v){
...     delete this[this.indexOf(v)]
... };
[Function]
> var myarray=["3","24","55","2"];
undefined
> myarray.remove("55");
undefined
> myarray
[ '3', '24', , '2' ]
1 голос
/ 18 апреля 2018
let arr = [5, 15, 25, 30, 35];
console.log(arr); //result [5, 15, 25, 30, 35]
let index = arr.indexOf(30);

if (index > -1) {
   arr.splice(index, 1);
}
console.log(arr); //result [5, 15, 25, 35]
1 голос
/ 10 февраля 2015

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

function cleanArrayOfSpecificTerms(array,unwantedTermsArray) {
  $.each(unwantedTermsArray, function( index, value ) {
    var index = array.indexOf(value);
    if (index > -1) {
      array.splice(index, 1);        
    }
  });
  return array;
}

Чтобы использовать, сделайте следующее:

var notInclude = ['Not','No','First','Last','Prior','Next', 'dogs','cats'];
var splitTerms = ["call", "log", "dogs", "cats", "topic", "change", "pricing"];

cleanArrayOfSpecificTerms(splitTerms,notInclude)
0 голосов
/ 21 марта 2015

// редактируется благодаря MarcoCI за совет

попробуйте это:

function wantDelete(item, arr){
  for (var i=0;i<arr.length;i++){
    if (arr[i]==item){
      arr.splice(i,1); //this delete from the "i" index in the array to the "1" length
      break;
    }
  }  
}
var goodGuys=wantDelete('bush', ['obama', 'bush', 'clinton']); //['obama', 'clinton']

надеюсь, что это поможет вам

0 голосов
/ 14 января 2013
var remove = function(array, value) {
    var index = null;

    while ((index = array.indexOf(value)) !== -1)
        array.splice(index, 1);

    return array;
};
0 голосов
/ 29 мая 2013

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

var newArray = referenceArray;

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

function newArrRemoveItem(array, item, newArray){
    for(var i = 0; i < array.length; i++) {
        if(array[i]!=item){
            newArray.push(array[i]);
        }
    }
}

Затем я использую его следующим образом в другой функции:

var vesselID = record.get('VesselID');
var otherVessels = new Array();
newArrRemoveItem(vesselArr,vesselID,otherVessels);

Теперь vesselArr остается неизменным, а каждый раз явыполнить приведенный выше код, массив otherVessels содержит все, кроме самого последнего элемента vesselID.

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