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

我有一个这样的数组

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

我想增加定义一个deleteElem()方法的数组对象,它的行为是这样的:

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

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

提前致谢。

这是如何完成的:

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

这段代码将删除数组中的“red”的一次。

我知道这个问题已经有了一个可以接受的答案,但是当我刚刚开始写代码的时候,我总是发现splice不是直截了当的。 即使在今天,它也不太可读。

但可读性很重要。

所以在这种情况下,我宁愿使用像这样的过滤方法:

 arr = ["orange","red","black","white","red"] arr = arr.filter(val => val !== "red"); console.log(arr) // ["orange","black","white"] 

就是这样。

请注意,此方法将删除arrays中所有出现的“红色”。

现在我发现真正有趣的是,你实际上可以很容易地阅读发生了什么事情。 在我的例子中,更有意思的是,如果你使用了一系列对象,你可以很容易地进一步,例如:

 arr = arr.filter(obj => obj.prop !== "red"); 

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

这里有一个下划线方法, http://underscorejs.org/#without

 arr = ["orange","red","black","white"]; arr = _.without(arr, "red"); 
 Array.prototype.deleteElem = function(val) { var index = this.indexOf(val); if (index >= 0) this.splice(index, 1); return this; }; var arr = ["orange","red","black","white"]; var arr2 = arr.deleteElem("red"); 

我的方法,让我们看看别人有什么要说的。 它也支持“等于”方法。

  // Remove array value // @param {Object} val Array.prototype.removeByValue = function (val) { for (var i = 0; i < this.length; i++) { var c = this[i]; if (c == val || (val.equals && val.equals(c))) { this.splice(i, 1); break; } } }; 

阅读https://stackoverflow.com/a/3010848/356726以了解在使用Array的原型时对迭代的影响。;

或者简单地检查所有项目,创build一个不相等的新数组并返回它。

 var arr = ['orange', 'red', 'black', 'white']; console.info('before: ' + JSON.stringify(arr)); var deleteElem = function ( val ) { var new_arr = []; for ( var i = 0; i < this.length; i++ ) { if ( this[i] !== val ) { new_arr.push(this[i]); } } return new_arr; }; arr = deleteElem('red'); console.info('after: ' + JSON.stringify(arr)); 

http://jsfiddle.net/jthavn3m/

诀窍是从头到尾浏览数组,所以在删除元素的时候不要搞乱索引。

 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现在是[“红”,“黑”,“白”]

最好的方法是使用拼接和重build新的数组,因为拼接后,数组的长度不会改变。

看看我的回答:

 function remove_array_value(array, value) { var index = array.indexOf(value); if (index >= 0) { array.splice(index, 1); reindex_array(array); } } function reindex_array(array) { var result = []; for (var key in array) { result.push(array[key]); } return result; } 

例:

 var example_arr = ['apple', 'banana', 'lemon']; // length = 3 remove_array_value(example_arr, 'banana'); 

香蕉被删除,数组长度= 2

如果订单数组(改变职位)不会是一个问题,你可以解决像:

 var arr = ["orange","red","black","white"]; arr.remove = function ( item ) { delete arr[item]; arr.sort(); arr.pop(); console.log(arr); } arr.remove('red'); 
 <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 

干得好:

 arr.deleteElem = function ( val ) { for ( var i = 0; i < this.length; i++ ) { if ( this[i] === val ) { this.splice( i, 1 ); return i; } } }; 

现场演示: http : //jsfiddle.net/4vaE2/3/

deleteElem方法返回已删除元素的索引。

 var idx = arr.deleteElem( 'red' ); // idx is 1