У меня есть массив:
arr = [50, 40, 50, 50];
Мне нужно удалить первый элемент, равный 50, и не трогать другой.
Этот код возвращает только [40]
.
arr = arr.filter(function(e) {return e !== 50}) // [40]
Но мне нужно
arr = arr.somefunction(function(e) {return e !== 50}) // [40, 50, 50]
Буду признателен за любую помощь.
Вы можете использовать переменную, чтобы отслеживать, удалили ли вы какое-либо значение или нет.
let deleteFirst = (value) => {
let arr = [50, 40, 50, 50];
let del = false
return arr.filter(val=> {
if (val === value && !del){
del = true
return false
}
return true
})
}
console.info(deleteFirst(50))
console.info(deleteFirst(40))
Вы можете использовать findIndex
и splice()
let arr = [50, 40, 50, 50];
arr.splice(arr.findIndex(a => a === 50), 1);
console.info(arr)
Если вам это нужно в prototype
массива, вы можете определить свой собственный метод.
function removeFirst(cb){
for(let i = 0;i<this.length;i++){
if (cb(this[i],i,this)){
return this.slice(0,i).concat(this.slice(i+1));
}
}
return this;
}
Object.defineProperty(Array.prototype,'removeFirst',{
value:removeFirst
})
let arr = [50,40,50,50];
let res = arr.removeFirst(x => x === 50);
console.info(res)
@KateGurman Подумайте о том, чтобы принять ответ, если он сработал для вас.
Внимание: если элемент не существует в массиве, удаляется первый элемент! считайте, что результат проверки findIndex
не равен -1, а затем используйте splice
.
Вы можете взять флаг и изменить его на первое найденное значение.
var array = [40, 40, 50, 40, 50, 40, 50],
found = false;
array = array.filter(v => found || !(found = v === 50));
console.info(array);
С помощью счетчика вы можете указать количество значений для фильтрации.
var array = [40, 40, 50, 40, 50, 40, 50],
count = 1;
array = array.filter(v => !count || (count -= v === 50));
console.info(array);
Вот каррированная функция для этого. Он не изменяет ваш исходный массив, вместо этого возвращая новый:
const removeFirst = (val) => ( xs = [], idx = xs .indexOf (val) ) => idx > -1
? xs .slice (0, idx) .concat ( xs .slice (idx + 1) )
: xs
console .log (
removeFirst (50) ([50, 40, 50, 50])
)
Если вы предпочитаете называть это как remove(50, [50, 40, 50, 50])
, вы можете просто изменить первую строку:
const removeFirst = (val, xs = [], idx = xs .indexOf (val) ) => idx > -1
? xs .slice (0, idx) .concat ( xs .slice (idx + 1) )
: xs
findIndex() возвращает индекс первого вхождения предоставленной функции. После этого вы можете просто удалить элемент с помощью splice().
let arr = [50, 40, 50, 50];
arr.splice(arr.findIndex(function(e) {return e === 50}), 1);
console.info(arr);
arr.splice(0, 1);
Изменяет сам массив и возвращает удаленные элементы в виде нового массива.