给出一个具有不同数据类型的数组。我编写了一个函数来查找那些false
的值,并返回不包含falsy
值的数组。
例如:
[7, "ate", "", false, 9] should return [7, "ate", 9].
这是我当前的代码:
function bouncer(arr)
{
for (var i = 0; i < arr.length; i++)
{
if (Boolean(arr[i]) == false)
{
arr.splice(i, 1);
}
}
console.log(arr);
}
但是,有一个问题:
I。)
In case of Input: bouncer([7, "ate", "", false, 9])
It returns: [ 7, 'ate', false, 9 ]
But it should return: [7, "ate", 9]
II。)
In case of input: `bouncer([false, null, 0, NaN, undefined, ""]);`
It returns: [ null, NaN, '' ]
But it should return: []
我不明白为什么它返回布尔假值,例如NaN
或null
。但是它可以正确拼接掉空字符串(""
)或undefined
之类的值。
我也不明白,为什么在第一种情况下它返回false
(这不是故意的),但是在第二种情况下却不返回false
。
非常感谢您的澄清。
答案 0 :(得分:1)
您差不多完成了,但是最好检查哪些值是虚假的,而不是比较它们,所以此功能可以解决问题
const getNonFalsyValues = (arr) => {
return arr.reduce((arr, current) => {
if (Boolean(current)) {
arr.push(current);
}
return arr;
}, []);
}
希望它能对您有所帮助。
答案 1 :(得分:1)
正如其他人所说,您可以为此目的使用filter()
。最简单的方法是:
const array = [false, null, true, 0, NaN, undefined, "", "Hola Mundo"];
console.log(array.filter(Boolean));
但是,回到您的代码,您应该注意,splice()
方法在检测到falsy
值时会更改数组(因为删除了一个元素)。换句话说,arr.length
在执行循环时急剧减少,但i
变量却在不断增加。这将导致该循环实际上不会循环该数组上的所有元素。要解决此问题,从数组中删除元素时,必须更正变量i
的值。检查下一个代码:
function bouncer(arr)
{
for (var i = 0; i < arr.length; i++)
{
if (Boolean(arr[i]) === false)
{
arr.splice(i, 1);
i = i - 1;
}
}
console.log(arr);
}
bouncer([false, null, true, 0, NaN, undefined, "", "Hola Mundo"]);
答案 2 :(得分:0)
像这样简单地使用filter。
此处的过滤器是仅在为true时才在输出数组中添加值。
let arr = [false, null, 0, NaN, undefined, "", 1 , 123];
let op = arr.filter(value => value);
console.log(op)
答案 3 :(得分:0)
const bouncer = (arr) => arr.filter(val => !!val);
答案 4 :(得分:0)