Я только что создал полифилл на Array.prototype
через Object.defineProperty
, чтобы удалить нужный элемент в массиве, не приводя к ошибкам при повторном его повторении через for .. in ..
if (!Array.prototype.remove) {
// Object.definedProperty is used here to avoid problems when iterating with "for .. in .." in Arrays
// /732717/dobavlenie-polzovatelskih-funktsii-v-array-prototype
Object.defineProperty(Array.prototype, 'remove', {
value: function () {
if (this == null) {
throw new TypeError('Array.prototype.remove called on null or undefined')
}
for (var i = 0; i < arguments.length; i++) {
if (typeof arguments[i] === 'object') {
if (Object.keys(arguments[i]).length > 1) {
throw new Error('This method does not support more than one key:value pair per object on the arguments')
}
var keyToCompare = Object.keys(arguments[i])[0]
for (var j = 0; j < this.length; j++) {
if (this[j][keyToCompare] === arguments[i][keyToCompare]) {
this.splice(j, 1)
break
}
}
} else {
var index = this.indexOf(arguments[i])
if (index !== -1) {
this.splice(index, 1)
}
}
}
return this
}
})
} else {
var errorMessage = 'DANGER ALERT! Array.prototype.remove has already been defined on this browser. '
errorMessage += 'This may lead to unwanted results when remove() is executed.'
console.log(errorMessage)
}
Удаление целочисленного значения
var a = [1, 2, 3]
a.remove(2)
a // Output => [1, 3]
Удаление строкового значения
var a = ['a', 'ab', 'abc']
a.remove('abc')
a // Output => ['a', 'ab']
Удаление логического значения
var a = [true, false, true]
a.remove(false)
a // Output => [true, true]
Также возможно удалить объект внутри массива с помощью этого метода Array.prototype.remove
.Вам просто нужно указать key => value
из Object
, который вы хотите удалить.
Удаление значения объекта
var a = [{a: 1, b: 2}, {a: 2, b: 2}, {a: 3, b: 2}]
a.remove({a: 1})
a // Output => [{a: 2, b: 2}, {a: 3, b: 2}]