javascript 数组清理函数
javascript array clean function
如果数组有 null 或空值,用于清除数组的简单函数,所以如果我们有:
[ 'click1', 'click2', null, '', '', 'submitForm' ]
...它将 return:
[ 'click1', 'click2', 'submitForm' ]
这是我的代码:
function squeakyClean(arr) {
for (var i = 0; i < arr.length; i++) {
if (arr[i] == null || arr[i] == '') {
arr.splice(i);
};
};
return arr;
}
我有一个 for 循环来检查数组中的每个值和一个 if 语句来查看它是否等于 null 或空字符串,如果是这样我使用数组拼接方法删除该值然后 return for 循环外的干净数组。
如果你输入一个没有空字符串或空值的数组,它会工作,但如果我输入 [ 1, , 2, 3, 0, -1, 1.1 ]
它 returns [1]
它不应该这样做。我在这里错过了什么?
PS:我看过其他人如何在没有 for 循环和拼接方法的情况下解决这个问题,但我对如何使用这两个方法解决它很感兴趣。
除了使用 .splice
方法之外,您的代码还不错,在该方法中您还必须指定要从该索引中删除的项目数。
示例:Array.splice(index, numberOfItemsFromIndex);
因此,要修复您的代码,它应该像这样简单:
function squeakyClean(arr) {
for (var i = 0; i < arr.length; i++) {
if (arr[i] == null || arr[i] == '') {
arr.splice(i, 1);
};
};
return arr;
}
考虑使用 filter
。例如,以下将过滤掉 null
、undefined
、false
、+0
、-0
、NaN
和 ""
:
arr.filter(Boolean)
您的代码有两个问题:
- 您必须将第二个参数传递给
splice
以告诉它您要删除多少项目
- 删除
splice
重新索引数组。这意味着当您删除前一个项目时,您将跳过一个项目。您可以向后迭代解决它。
function squeakyClean(arr) {
for (var i = arr.length-1; i >= 0 ; --i)
if (arr[i] == null || arr[i] == '')
arr.splice(i, 1);
return arr;
}
不使用 splice 或其他函数,您可以像这样在另一个数组中滑动所有空值:
function swipeArray(arr) {
var newArr = new Array();
for (var i = 0; i < arr.length; i++) {
if (arr[i]||arr[i]===0||arr[i]===false)
newArr.push(arr[i]);
}
return newArr;
}
var arr = new Array('click1', 'click2', null, '', '', 'submitForm',0,false);
document.getElementById("out").textContent = JSON.stringify(swipeArray(arr))
<p id="out"></p>
编辑:如果扩展if条件,可以避免清理0
、false
或数组中的其他值。
alert(
[ 'click1', 'click2', null, '', '', 'submitForm' ].filter(function(x){
return !!x; // or simple `return x;`
})
)
如果数组有 null 或空值,用于清除数组的简单函数,所以如果我们有:
[ 'click1', 'click2', null, '', '', 'submitForm' ]
...它将 return:
[ 'click1', 'click2', 'submitForm' ]
这是我的代码:
function squeakyClean(arr) {
for (var i = 0; i < arr.length; i++) {
if (arr[i] == null || arr[i] == '') {
arr.splice(i);
};
};
return arr;
}
我有一个 for 循环来检查数组中的每个值和一个 if 语句来查看它是否等于 null 或空字符串,如果是这样我使用数组拼接方法删除该值然后 return for 循环外的干净数组。
如果你输入一个没有空字符串或空值的数组,它会工作,但如果我输入 [ 1, , 2, 3, 0, -1, 1.1 ]
它 returns [1]
它不应该这样做。我在这里错过了什么?
PS:我看过其他人如何在没有 for 循环和拼接方法的情况下解决这个问题,但我对如何使用这两个方法解决它很感兴趣。
除了使用 .splice
方法之外,您的代码还不错,在该方法中您还必须指定要从该索引中删除的项目数。
示例:Array.splice(index, numberOfItemsFromIndex);
因此,要修复您的代码,它应该像这样简单:
function squeakyClean(arr) {
for (var i = 0; i < arr.length; i++) {
if (arr[i] == null || arr[i] == '') {
arr.splice(i, 1);
};
};
return arr;
}
考虑使用 filter
。例如,以下将过滤掉 null
、undefined
、false
、+0
、-0
、NaN
和 ""
:
arr.filter(Boolean)
您的代码有两个问题:
- 您必须将第二个参数传递给
splice
以告诉它您要删除多少项目 - 删除
splice
重新索引数组。这意味着当您删除前一个项目时,您将跳过一个项目。您可以向后迭代解决它。
function squeakyClean(arr) {
for (var i = arr.length-1; i >= 0 ; --i)
if (arr[i] == null || arr[i] == '')
arr.splice(i, 1);
return arr;
}
不使用 splice 或其他函数,您可以像这样在另一个数组中滑动所有空值:
function swipeArray(arr) {
var newArr = new Array();
for (var i = 0; i < arr.length; i++) {
if (arr[i]||arr[i]===0||arr[i]===false)
newArr.push(arr[i]);
}
return newArr;
}
var arr = new Array('click1', 'click2', null, '', '', 'submitForm',0,false);
document.getElementById("out").textContent = JSON.stringify(swipeArray(arr))
<p id="out"></p>
编辑:如果扩展if条件,可以避免清理0
、false
或数组中的其他值。
alert(
[ 'click1', 'click2', null, '', '', 'submitForm' ].filter(function(x){
return !!x; // or simple `return x;`
})
)