按值删除数组元素的最佳方法

ant*_*njs 45 javascript arrays

我有这样的数组

arr = ["orange","red","black","white"]
Run Code Online (Sandbox Code Playgroud)

我想扩充定义一个deleteElem()方法的数组对象,其行为如下:

arr2 = arr.deleteElem("red"); // ["orange","black","white"] (with no hole)
Run Code Online (Sandbox Code Playgroud)

仅使用value参数(无索引)完成此任务的最佳方法是什么?

Mau*_*res 89

以下是它的完成方式:

var arr = ["orange","red","black","white"];
var index = arr.indexOf("red");
if (index >= 0) {
  arr.splice( index, 1 );
}
Run Code Online (Sandbox Code Playgroud)

此代码将删除数组中出现的"红色"1.

  • 非常危险,因为如果"红色"不在数组中则删除"白色" (14认同)
  • 此外,您必须扩充您的数组以支持`.indexOf()`,这在某些旧版本的IE中不受支持. (5认同)
  • @IvanMalyshev同意,这是非常危险的.Array.prototype.splice(index,howMany)允许负索引,因此您需要在调用splice之前检查indexOf是否返回-1(未找到). (2认同)

Rom*_*ent 24

我知道这个问题已经有了一个可接受的答案,但当我刚接触编码时,我总是发现它splice并不是直截了当的.即使在今天,它仍然感觉不太

但可读性很重要.

所以在这种情况下我宁愿使用过滤方法,如下所示:

arr = ["orange","red","black","white","red"]

arr = arr.filter(val => val !== "red");

console.log(arr) // ["orange","black","white"]
Run Code Online (Sandbox Code Playgroud)

就是这样.

请注意,此方法会删除数组中出现的所有"红色".

现在我觉得这很有趣,你真的可以很容易地阅读发生的事情.在我的情况下更有趣的是,如果你使用对象数组,你可以轻松地走得更远,例如:

arr = arr.filter(obj => obj.prop !== "red");
Run Code Online (Sandbox Code Playgroud)

根据ryannjohnson的评论,这种方法似乎没有任何警告.

  • 看起来它得到了很好的支持:[https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter#Browser_compatibility ](https://developer.mozilla.org/en -US /文档/网络/ JavaScript的/参考/ Global_Objects /阵列/滤波器#Browser_compatibility) (2认同)