Как удалить элемент из массива по значению?
Есть ли способ удалить элемент из массива JavaScript?
Учитывая массив:
var ary = ['three', 'seven', 'eleven'];
Я хотел бы сделать что-то вроде:
removeItem('seven', ary);
Я просмотрел splice()
, но это только удаляет номер позиции, тогда как мне нужно что-то, чтобы удалить элемент по его значению.
Ответы
Ответ 1
Это может быть глобальная функция или метод настраиваемого объекта, если вам не разрешено добавлять в собственные прототипы. Он удаляет все элементы из массива, которые соответствуют любому из аргументов.
Array.prototype.remove = function() {
var what, a = arguments, L = a.length, ax;
while (L && this.length) {
what = a[--L];
while ((ax = this.indexOf(what)) !== -1) {
this.splice(ax, 1);
}
}
return this;
};
var ary = ['three', 'seven', 'eleven'];
ary.remove('seven');
/* returned value: (Array)
three,eleven
*/
Чтобы сделать его глобальным -
function removeA(arr) {
var what, a = arguments, L = a.length, ax;
while (L > 1 && arr.length) {
what = a[--L];
while ((ax= arr.indexOf(what)) !== -1) {
arr.splice(ax, 1);
}
}
return arr;
}
var ary = ['three', 'seven', 'eleven'];
removeA(ary, 'seven');
/* returned value: (Array)
three,eleven
*/
И позаботиться о IE8 и ниже -
if(!Array.prototype.indexOf) {
Array.prototype.indexOf = function(what, i) {
i = i || 0;
var L = this.length;
while (i < L) {
if(this[i] === what) return i;
++i;
}
return -1;
};
}
Ответ 2
Вы можете использовать метод indexOf
следующим образом:
var index = array.indexOf(item);
if (index !== -1) array.splice(index, 1);
Примечание: Вам нужно закрепить его для IE8 и ниже
var array = [1,2,3,4]
var item = 3
var index = array.indexOf(item);
if (index !== -1) array.splice(index, 1);
console.log(array)
Ответ 3
Один лайнер сделает это,
var ary = ['three', 'seven', 'eleven'];
// Remove item 'seven' from array
var filteredAry = ary.filter(function(e) { return e !== 'seven' })
//=> ["three", "eleven"]
// In ECMA6 (arrow function syntax):
var filteredAry = ary.filter(e => e !== 'seven')
Это использует функцию filter в JS. Он поддерживается в IE9 и выше.
Что он делает (из ссылки doc)
filter() вызывает предоставленную функцию обратного вызова один раз для каждого элемента в массиве и создает новый массив из всех значений, для которых обратный вызов возвращает значение, которое приводит к истинному. callback вызывается только для индексов массива, которым присвоены значения; он не вызывается для индексов, которые были удалены или которые никогда не были присвоены значениям. Элементы массива, которые не проходят тест обратного вызова, просто пропускаются и не включаются в новый массив.
В принципе, это то же самое, что и все другие решения for (var key in ary) { ... }
, за исключением того, что конструкция for in
поддерживается как IE6.
В принципе, фильтр - это метод удобства, который выглядит намного приятнее (и является цепным), в отличие от конструкции for in
(AFAIK).
Ответ 4
Вы можете использовать underscore.js. Это действительно упрощает процесс.
Например, при этом:
var result = _.without(['three','seven','eleven'], 'seven');
И result
будет ['three','eleven']
.
В вашем случае код, который вам нужно написать:
ary = _.without(ary, 'seven')
Он уменьшает код, который вы пишете.
Ответ 5
Проверьте этот способ:
for(var i in array){
if(array[i]=='seven'){
array.splice(i,1);
break;
}
}
и в функции:
function removeItem(array, item){
for(var i in array){
if(array[i]==item){
array.splice(i,1);
break;
}
}
}
removeItem(array, 'seven');
Ответ 6
Здесь версия, в которой используется функция jQuery inArray:
var index = $.inArray(item, array);
if (index != -1) {
array.splice(index, 1);
}
Ответ 7
Вы можете сделать это двумя способами:
var arr = ["1","2","3","4"] // we wanna delete number "3"
первый:
arr.indexOf('3') !== -1 && arr.splice(arr.indexOf('3'), 1)
секунда (ES6):
arr = arr.filter(e => e !== '3')
Ответ 8
var index = array.indexOf('item');
if(index!=-1){
array.splice(index, 1);
}
Ответ 9
Что вам нужно, так это фильтр
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter
Это позволит вам сделать следующее:
var ary = ['three', 'seven', 'eleven'];
var aryWithoutSeven = ary.filter(function(value) { return value != 'seven' });
console.log(aryWithoutSeven); // returns ['three', 'eleven']
Это также было отмечено в этой теме где-то еще: fooobar.com/questions/14237/...
Ответ 10
Просто
var ary = ['three', 'seven', 'eleven'];
var index = ary.indexOf('seven'); // get index if value found otherwise -1
if (index > -1) { //if found
ary.splice(index, 1);
}
Ответ 11
Самое простое решение:
массив - массив для удаления некоторого элемента valueForRemove;
valueForRemove - элемент для удаления;
array.filter(arrayItem => !array.includes(valueForRemove));
Более просто:
array.filter(arrayItem => arrayItem !== valueForRemove);
Не красиво, но работает:
array.filter(arrayItem => array.indexOf(arrayItem) != array.indexOf(valueForRemove))
Не красиво, но работает:
while(array.indexOf(valueForRemove) !== -1) {
array.splice(array.indexOf(valueForRemove), 1)
}
Ответ 12
Видя, что там не очень красиво, вот простая и многоразовая функция ES6.
const removeArrayItem = (arr, itemToRemove) => {
return arr.filter(item => item !== itemToRemove)
}
Использование:
const items = ['orange', 'purple', 'orange', 'brown', 'red', 'orange']
removeArrayItem(items, 'orange')
Ответ 13
ES6 путь.
const commentsWithoutDeletedArray = commentsArray.filter(comment => comment.Id !== commentId);
Ответ 14
На самом деле, я не понимаю, почему это не может быть решено с помощью
arr = arr.filter(value => value !== 'seven');
Или, может быть, вы хотите использовать ванильный JS
arr = arr.filter(function(value) { return value !== 'seven' });
Ответ 15
Если у вас есть уникальные значения в вашем массиве и порядок не имеет значения, вы можете использовать Set, и он имеет delete:
var mySet = new Set(['foo']);
mySet.delete('foo'); // Returns true. Successfully removed.
mySet.has('foo'); // Returns false. The "foo" element is no longer present.
Ответ 16
Удаление всех совпадающих элементов из массива (а не только первый, как представляется, наиболее общий ответ здесь):
while ($.inArray(item, array) > -1) {
array.splice( $.inArray(item, array), 1 );
}
Я использовал jQuery для тяжелой работы, но вы поняли, хотите ли вы пойти на родной язык.
Ответ 17
Когда вам нужно удалить значение, присутствующее несколько раз в массиве (например, [1,2,2,2, 4, 5,6]).
function removeFrmArr(array, element) {
return array.filter(e => e !== element);
};
var exampleArray = [1,2,3,4,5];
removeFrmArr(exampleArray, 3);
// return value like this
//[1, 2, 4, 5]
Вы можете использовать splice для удаления одного элемента из массива, но splice не может удалить несколько похожих элементов из массива.
function singleArrayRemove(array, value){
var index = array.indexOf(value);
if (index > -1) array.splice(index, 1);
return array;
}
var exampleArray = [1,2,3,4,5,5];
singleArrayRemove(exampleArray, 5);
// return value like this
//[1, 2, 3, 4, 5]
Ответ 18
очень чистое решение, работающее во всех браузерах и без каких-либо фреймворков, - это присвоить новый массив и просто вернуть его без элемента, который вы хотите удалить:
/**
* @param {Array} array the original array with all items
* @param {any} item the time you want to remove
* @returns {Array} a new Array without the item
*/
var removeItemFromArray = function(array, item){
/* assign a empty array */
var tmp = [];
/* loop over all array items */
for(var index in array){
if(array[index] !== item){
/* push to temporary array if not like item */
tmp.push(array[index]);
}
}
/* return the temporary array */
return tmp;
}
Ответ 19
Во всех уникальных значениях вы можете:
a = new Set([1,2,3,4,5]) // a = Set(5) {1, 2, 3, 4, 5}
a.delete(3) // a = Set(5) {1, 2, 4, 5}
[...a] // [1, 2, 4, 5]
Ответ 20
indexOf
- вариант, но реализация в основном ищет весь массив для значения, поэтому время выполнения растет с размером массива. (так что это в каждом браузере, я думаю, я только проверял Firefox).
У меня нет IE6 для проверки, но я бы назвал его безопасной ставкой, чтобы вы могли проверять хотя бы миллион элементов массива в секунду таким образом практически на любой клиентской машине. Если [размер массива] * [поисковые запросы в секунду] может вырасти больше миллиона, вы должны рассмотреть другую реализацию.
В принципе вы можете использовать объект для создания индекса для своего массива, например:
var index={'three':0, 'seven':1, 'eleven':2};
Любая нормальная среда JavaScript создаст индекс поиска для таких объектов, чтобы вы могли быстро перевести ключ в значение, независимо от того, сколько свойств имеет объект.
Это всего лишь базовый метод, в зависимости от вашей потребности вы можете объединить несколько объектов и/или массивов, чтобы сделать те же данные быстро доступными для поиска для разных свойств. Если вы укажете свои конкретные потребности, я могу предложить более конкретную структуру данных.
Ответ 21
Вы можете добиться этого, используя функцию Lodash _.remove
.
var array = ['three', 'seven', 'eleven'];
var evens = _.remove(array, function(e) {
return e !== 'seven';
});
console.log(evens);
<script type="text/javascript" src="https://cdn.jsdelivr.net/npm/[email protected]/lodash.min.js"></script>
Ответ 22
Трюк состоит в том, чтобы пройти через массив от начала до начала, поэтому вы не испортите индексы при удалении элементов.
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 теперь [ "красный", "черный", "белый" ]
Ответ 23
Вы можете использовать without
или pull
из Lodash:
const _ = require('lodash');
_.without([1, 2, 3, 2], 2); // -> [1, 3]
Ответ 24
Неразрушающее удаление:
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;
}
Ответ 25
Пожалуйста, не используйте вариант с 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' ]
Ответ 26
Я использовал самый проголосовавший вариант и создал функцию, которая очистила бы один массив слов, используя другой массив нежелательных слов:
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)
Ответ 27
Вы можете решить эту проблему с помощью метода indexOf.
Сначала найдите индекс элемента, который вы хотите удалить:
var ary = ['three', 'seven', 'eleven'];
var index = ary.indexOf('seven');
Затем удалите его с помощью метода splice:
if (index > -1) {
ary.splice(index, 1);
}
N.B: поддержка браузера для indexOf ограничена; он не поддерживается в Internet Explorer 7 и 8. Пожалуйста, проверьте здесь
Ответ 28
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]
Ответ 29
В глобальной функции мы не можем передать пользовательское значение напрямую, но есть много способов, как показано ниже
var ary = ['three', 'seven', 'eleven'];
var index = ary.indexOf(item);//item: the value which you want to remove
//Method 1
ary.splice(index,1);
//Method 2
delete ary[index]; //in this method the deleted element will be undefined
Ответ 30
var remove = function(array, value) {
var index = null;
while ((index = array.indexOf(value)) !== -1)
array.splice(index, 1);
return array;
};