Лучший способ удалить элемент массива по значению

У меня есть массив вроде этого

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

Я хочу увеличить объект массива, определяющий метод deleteElem(), который действует следующим образом:

arr2 = arr.deleteElem("red"); // ["orange","black","white"] (with no hole)

Каков наилучший способ выполнить эту задачу, используя только параметр значения (без индекса)?

Ответ 1

Вот как это делается:

var arr = ["orange","red","black","white"];
var index = arr.indexOf("red");
if (index >= 0) {
  arr.splice( index, 1 );
}

Этот код удалит 1 случайность "красного" в вашем массиве.

Ответ 2

Я знаю, что вопрос уже имеет принятый ответ, но назад, когда я был новичком в кодировании, я всегда считал splice не прямым. Даже сегодня он чувствует себя менее читаемым.

Но показатель удобочитаемости.

Итак, в этом случае я предпочел бы использовать метод фильтра следующим образом:

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

arr = arr.filter(val => val !== "red");

console.log(arr) // ["orange","black","white"]

И что это.

Обратите внимание, что этот метод удаляет все вхождения "красного" в вашем массиве.

Теперь то, что я нахожу действительно интересным с этим, вы действительно можете прочитать, что происходит довольно легко. Еще более интересным в моем случае является то, что вы можете легко идти дальше, если работаете с массивом объектов, например:

arr = arr.filter(obj => obj.prop !== "red");

В соответствии с комментарием ryannjohnson, похоже, не существует никаких оговорок с этим методом.

Ответ 3

Для этого есть метод подчеркивания, http://underscorejs.org/#without

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

arr = _.without(arr, "red");

Ответ 4

Мой подход, посмотрим, что другие скажут. Он поддерживает метод "равно".

 // Remove array value
 // @param {Object} val
 Array.prototype.removeByValue = function (val) {
    for (var i = 0; i < this.length; i++) {
       var c = this[i];
       if (c == val || (val.equals && val.equals(c))) {
          this.splice(i, 1);
          break;
       }
    }
 };

Прочитайте fooobar.com/questions/423/... для воздействия на итерации при использовании прототипа с массивом.

Ответ 5

Array.prototype.deleteElem = function(val) {
    var index = this.indexOf(val); 
    if (index >= 0) this.splice(index, 1);
    return this;
}; 
var arr = ["orange","red","black","white"];
var arr2 = arr.deleteElem("red");

Ответ 6

Или просто проверьте все элементы, создайте новый массив с не равным и верните его.

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

console.info('before: ' + JSON.stringify(arr));

var deleteElem = function ( val ) {
    var new_arr = [];
    for ( var i = 0; i < this.length; i++ ) {
        if ( this[i] !== val ) {
            new_arr.push(this[i]);
        }
    }
    return new_arr;
};

arr = deleteElem('red');

console.info('after: ' + JSON.stringify(arr));

http://jsfiddle.net/jthavn3m/

Ответ 7

Трюк состоит в том, чтобы пройти через массив от начала до начала, поэтому вы не испортите индексы при удалении элементов.

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

arr теперь [ "красный", "черный", "белый" ]

Ответ 8

Лучший способ - использовать сплайсинг и перестроить новый массив, потому что после сращивания длина массива не изменяется.

Посмотрите мой ответ:

function remove_array_value(array, value) {
    var index = array.indexOf(value);
    if (index >= 0) {
        array.splice(index, 1);
        reindex_array(array);
    }
}
function reindex_array(array) {
   var result = [];
    for (var key in array) {
        result.push(array[key]);
    }
    return result;
}

Пример:

var example_arr = ['apple', 'banana', 'lemon'];   // length = 3
remove_array_value(example_arr, 'banana');

банана удаляется, а длина массива = 2

Ответ 9

Если порядок массива (смена позиций) не будет проблемой, вы можете решить, например:

var arr = ["orange","red","black","white"];
arr.remove = function ( item ) {
  delete arr[item];
  arr.sort();
  arr.pop();
  console.log(arr);
}

arr.remove('red');
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

Ответ 10

Здесь вы идете:

arr.deleteElem = function ( val ) {
    for ( var i = 0; i < this.length; i++ ) {
        if ( this[i] === val ) {
            this.splice( i, 1 );
            return i;
        }
    }
};

Живая демонстрация: http://jsfiddle.net/4vaE2/3/

Метод deleteElem возвращает индекс удаляемого элемента.

var idx = arr.deleteElem( 'red' ); // idx is 1