我编写了一个脚本,使用.splice()删除任何null,undefined,0,false或空字符串值,但代码只删除了NaN和0。
以下是我的尝试:
function remove(arr){ // input [NaN, 0, 15, false, -22, '',undefined, 47, null]
var bin = [];
for (var i =0; i<arr.length; i++){
if (arr[i] == (NaN || 0 || false || "" || undefined || null)){
arr.splice(arr[i],1);
}
}
console.log(arr); // Expected output [15, -22, 47]
}
答案 0 :(得分:3)
代码中的问题:
Array#splice
期望第一个参数为索引,而不是项目本身NaN
,请使用isNaN()
。工作代码:
function remove(arr) {
for (var i = arr.length - 1; i >= 0; i--) {
if (isNaN(arr[i]) || arr[i] === 0 || arr[i] === false || arr[i] === "" || arr[i] === undefined || arr[i] === null) {
// Which is same as
// if (!arr[i]) {
arr.splice(i, 1);
}
}
console.log(arr); // Expected output [15, -22, 47]
}
remove([NaN, 0, 15, false, -22, '', undefined, 47, null]);
&#13;
arr = arr.filter(e => e);
var input = [NaN, 0, 15, false, -22, '',undefined, 47, null];
var filteredArr = input.filter(e => e);
document.body.innerHTML = '<pre>' + JSON.stringify(filteredArr, 0, 4) + '</pre>';
&#13;
中的comment所述
arr = arr.filter(Boolean);
var input = [NaN, 0, 15, false, -22, '',undefined, 47, null];
var filteredArr = input.filter(Boolean);
document.body.innerHTML = '<pre>' + JSON.stringify(filteredArr, 0, 4) + '</pre>';
&#13;
答案 1 :(得分:2)
此解决方案可能效率不高
function filterArray(el) {
return (typeof (el) === "number" && el != 0 && !isNaN(el));
}
arr = [NaN, 0, 15, false, -22, '', undefined, 47, null];
console.log(arr.filter(filterArray));
答案 2 :(得分:2)
使用lodash。
console.log(_.compact(arr));
答案 3 :(得分:1)
您指的是使用ingredients:Ember.computed('selectedRecipe', function(){
// do filtering stuff and return the result
return this.get('customArray').filterBy('name',this.get('selectedRecipe'));
})
,因此我假设您需要一个就地(变异)解决方案。这是一个简单,快速的方法:
splice
如果您关心(并且您可能不应该),这比function compact(a) {
var i = 0, j = 0;
while (i < a.length) {
var v = a[i++];
if (v) a[j++] = v;
}
a.length = j;
}
上的循环快10倍。请参阅http://jsperf.com/compacting-an-array。
如果你想要一个创建新阵列的解决方案,使用splice
在其他答案中给出的替代方案很好,但这里是一个基本版本:
filter
答案 4 :(得分:0)
function bouncer(arr) {
var newArr=arr.slice(0);
var n=0;
for(var i=0; i<arr.length;i++){
if(arr[i]==false||arr[i]==null||arr[i]==0||arr[i]==""||arr[i]==undefined||Number.isNaN(arr[i])==true){
newArr.splice(n,1);
} else n++;
}
console.log(newArr);
return newArr;
}
bouncer([null, NaN, 1, 2, undefined,0,'a']);
我尝试用slice()做它。对于NaN,我使用了Number.isNaN()函数,如果返回true,则继续... 输入为[null,NaN,1、2,未定义,0,'a'],并按预期返回了[1、2,'a'] ...希望对您有所帮助