有没有一种方法可以从 JavaScript 数组中移除一个元素?
给定一个数组:
var ary = ['three', 'seven', 'eleven'];
我想要做类似这样的事情:
removeItem('seven', ary);
我研究了splice()
,但那只能按位置号删除,我需要一种可以按值删除项目的方法。
有没有一种方法可以从 JavaScript 数组中移除一个元素?
给定一个数组:
var ary = ['three', 'seven', 'eleven'];
我想要做类似这样的事情:
removeItem('seven', ary);
我研究了splice()
,但那只能按位置号删除,我需要一种可以按值删除项目的方法。
我尝试使用上面jbaron的函数方法,但发现我需要保留原始数组以供稍后使用,并像这样创建一个新数组:
var newArray = referenceArray;
显然是通过引用而不是值创建的,因为当我从newArray中删除一个元素时,referenceArray也被删除了。所以我决定每次都像这样创建一个新数组:
function newArrRemoveItem(array, item, newArray){
for(var i = 0; i < array.length; i++) {
if(array[i]!=item){
newArray.push(array[i]);
}
}
}
然后我在另一个函数中这样使用它:
var vesselID = record.get('VesselID');
var otherVessels = new Array();
newArrRemoveItem(vesselArr,vesselID,otherVessels);
现在,每次执行上述代码时,vesselArr保持不变,而otherVessels数组包括除最新的vesselID元素以外的所有元素。
另一种变化:
if (!Array.prototype.removeArr) {
Array.prototype.removeArr = function(arr) {
if(!Array.isArray(arr)) arr=[arr];//let's be nice to people who put a non-array value here.. that could be me!
var that = this;
if(arr.length){
var i=0;
while(i<that.length){
if(arr.indexOf(that[i])>-1){
that.splice(i,1);
}else i++;
}
}
return that;
}
}
这又是在循环中使用indexOf(),但假设要删除的数组相对于要清理的数组较小;每次删除都会缩短while循环。
//This function allows remove even array from array
var removeFromArr = function(arr, elem) {
var i, len = arr.length, new_arr = [],
sort_fn = function (a, b) { return a - b; };
for (i = 0; i < len; i += 1) {
if (typeof elem === 'object' && typeof arr[i] === 'object') {
if (arr[i].toString() === elem.toString()) {
continue;
} else {
if (arr[i].sort(sort_fn).toString() === elem.sort(sort_fn).toString()) {
continue;
}
}
}
if (arr[i] !== elem) {
new_arr.push(arr[i]);
}
}
return new_arr;
}
使用示例
var arr = [1, '2', [1 , 1] , 'abc', 1, '1', 1];
removeFromArr(arr, 1);
//["2", [1, 1], "abc", "1"]
var arr = [[1, 2] , 2, 'a', [2, 1], [1, 1, 2]];
removeFromArr(arr, [1,2]);
//[2, "a", [1, 1, 2]]
看看这个方法:
delete this.arrayName[this.arrayName.indexOf(value)];
参考资料:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/delete
//感谢MarcoCI的建议,进行了编辑
试试这个:
function wantDelete(item, arr){
for (var i=0;i<arr.length;i++){
if (arr[i]==item){
arr.splice(i,1); //this delete from the "i" index in the array to the "1" length
break;
}
}
}
var goodGuys=wantDelete('bush', ['obama', 'bush', 'clinton']); //['obama', 'clinton']
希望这能帮到你
for in
,这是一种不好的做法,如果有人触及了 Array 原型,你就完蛋了。 - MarcoLCoffeeScript + jQuery 变体:
arrayRemoveItemByValue = (arr,value) ->
r=$.inArray(value, arr)
unless r==-1
arr.splice(r,1)
# return
arr
console.log arrayRemoveItemByValue(['2','1','3'],'3')
它只删除一个,而不是全部。
你可以使用lodash pull函数
var ary = ['three', 'seven', 'eleven'];
_.pull(ary, 'seven'); // ['three', 'eleven']
console.log(ary)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.6.1/lodash.js"></script>
Array.filter()
翻译为 "数组过滤",它是 JavaScript 中的一个数组方法。该方法可用于创建一个新数组,其中包含原始数组中满足特定条件的所有元素。使用该方法需要提供一个回调函数,该函数接受三个参数:当前元素、元素索引和数组本身。回调函数应返回一个布尔值,指示当前元素是否应包含在新数组中。 - Eric Hodonsky