按值删除数组元素的最好方法
我有一个这样的数组
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));
诀窍是从头到尾浏览数组,所以在删除元素的时候不要搞乱索引。
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