Ответ 1
Вот как это делается:
var arr = ["orange","red","black","white"];
var index = arr.indexOf("red");
if (index >= 0) {
arr.splice( index, 1 );
}
Этот код удалит 1 случайность "красного" в вашем массиве.
У меня есть массив вроде этого
arr = ["orange","red","black","white"]
Я хочу увеличить объект массива, определяющий метод deleteElem()
, который действует следующим образом:
arr2 = arr.deleteElem("red"); // ["orange","black","white"] (with no hole)
Каков наилучший способ выполнить эту задачу, используя только параметр значения (без индекса)?
Вот как это делается:
var arr = ["orange","red","black","white"];
var index = arr.indexOf("red");
if (index >= 0) {
arr.splice( index, 1 );
}
Этот код удалит 1 случайность "красного" в вашем массиве.
Я знаю, что вопрос уже имеет принятый ответ, но назад, когда я был новичком в кодировании, я всегда считал 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, похоже, не существует никаких оговорок с этим методом.
Для этого есть метод подчеркивания, http://underscorejs.org/#without
arr = ["orange","red","black","white"];
arr = _.without(arr, "red");
Мой подход, посмотрим, что другие скажут. Он поддерживает метод "равно".
// 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/... для воздействия на итерации при использовании прототипа с массивом.
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");
Или просто проверьте все элементы, создайте новый массив с не равным и верните его.
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));
Трюк состоит в том, чтобы пройти через массив от начала до начала, поэтому вы не испортите индексы при удалении элементов.
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 теперь [ "красный", "черный", "белый" ]
Лучший способ - использовать сплайсинг и перестроить новый массив, потому что после сращивания длина массива не изменяется.
Посмотрите мой ответ:
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
Если порядок массива (смена позиций) не будет проблемой, вы можете решить, например:
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>
Здесь вы идете:
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