【问题标题】:Extending Array with custom method that removes an element by value使用按值删除元素的自定义方法扩展数组
【发布时间】:2014-12-23 21:44:50
【问题描述】:

我必须创建一个新的数组方法,当它被调用时,它会从数组中删除一个特定的“值”。它适用于数字,但是当我使用字符串时,它会返回一个空数组...

Array.prototype.removeItem = function(value){
	for(var key in this){
	this.splice(this.indexOf(value), 1);
	}
}

var arr = [1, 2, 1, 4, 1, 3, 4, 1, 111, 3, 2, 1, '1'];
console.log(arr);
arr.removeItem(1);
console.log(arr);

var arrSecond = ['hi', 'bye', 'hello' ];
console.log(arrSecond);
arrSecond.removeItem('hi');
console.log(arrSecond);

【问题讨论】:

  • 我真的不认为它适用于数字...[2, 4, 3, 4, 111](我得到的结果)缺少3'1'
  • 由于indexOf() 方法,您的迭代不断减少数组。
  • 这样的循环拼接是个坏消息
  • 既然您使用的是 indexOf,为什么还要进行迭代?并且当有 forEachmapreduce 时,不推荐对数组使用 for..in过滤器

标签: javascript arrays string methods prototype


【解决方案1】:

如果没有找到 valueindexOf 将返回 -1。传递给 splice 的负数从末尾开始计算。见ECMA-262 §15.4.4.14

因此,一旦您从数组中删除了值,之后您将删除最后一个成员。

更好的方法可能是这样的:

var index;
while ((index = this.indexOf(value)) > -1) {
  this.splice(index, 1);
}

for..in 不应在此处使用,请考虑 forEach for Array 循环。

【讨论】:

  • 非常感谢!我是新手,很抱歉,我犯了这么愚蠢的错误,但我正在学习。您为每个需要帮助的人伸出了援助之手,所以再次感谢您!谢谢你和其他所有人,上面评论...
猜你喜欢
  • 1970-01-01
  • 2011-11-10
  • 1970-01-01
  • 2014-09-16
  • 2019-01-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多