无法删除数组中的所有 Boolean == false
Can't remove all Boolean == false in array
给定一个具有不同数据类型的数组。我编写了一个函数来查找 false
和 return 数组中没有 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);
}
但是,有一个问题:
我.)
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: []
我不明白为什么它 return 是像 NaN
或 null
这样的布尔假值。但它正确拼接空字符串 (""
) 或 undefined
.
等值
而且我也不明白,为什么在第一种情况下它 returns false
(这不是故意的),但在第二种情况下它不 return s false
.
非常感谢您的澄清。
只需像这样使用filter。
过滤器在这里的作用是仅当它为真时才在输出数组中添加值。
let arr = [false, null, 0, NaN, undefined, "", 1 , 123];
let op = arr.filter(value => value);
console.log(op)
const bouncer = (arr) => arr.filter(val => !!val);
您几乎完成了,但是最好检查哪些值是假的而不是比较它们,所以这个函数可以解决问题
const getNonFalsyValues = (arr) => {
return arr.reduce((arr, current) => {
if (Boolean(current)) {
arr.push(current);
}
return arr;
}, []);
}
希望对您有所帮助
在 JavaScript 中,某些值的计算结果为 false
,例如 null
、空字符串 ''
和 undefined
。您可以在 JavaScript here.
中查看有关评估的更多信息
此外,您应该在比较中使用 ===
而不是 ==
。参见 this。
正如其他人所说,您可以使用 filter()
来达到这个目的。最短路线是:
const array = [false, null, true, 0, NaN, undefined, "", "Hola Mundo"];
console.log(array.filter(Boolean));
.as-console {background-color:black !important; color:lime;}
.as-console-wrapper {max-height:100% !important; top:0;}
但是,回到您的代码,您应该注意到 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"]);
.as-console {background-color:black !important; color:lime;}
.as-console-wrapper {max-height:100% !important; top:0;}
给定一个具有不同数据类型的数组。我编写了一个函数来查找 false
和 return 数组中没有 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);
}
但是,有一个问题:
我.)
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: []
我不明白为什么它 return 是像 NaN
或 null
这样的布尔假值。但它正确拼接空字符串 (""
) 或 undefined
.
而且我也不明白,为什么在第一种情况下它 returns false
(这不是故意的),但在第二种情况下它不 return s false
.
非常感谢您的澄清。
只需像这样使用filter。
过滤器在这里的作用是仅当它为真时才在输出数组中添加值。
let arr = [false, null, 0, NaN, undefined, "", 1 , 123];
let op = arr.filter(value => value);
console.log(op)
const bouncer = (arr) => arr.filter(val => !!val);
您几乎完成了,但是最好检查哪些值是假的而不是比较它们,所以这个函数可以解决问题
const getNonFalsyValues = (arr) => {
return arr.reduce((arr, current) => {
if (Boolean(current)) {
arr.push(current);
}
return arr;
}, []);
}
希望对您有所帮助
在 JavaScript 中,某些值的计算结果为 false
,例如 null
、空字符串 ''
和 undefined
。您可以在 JavaScript here.
此外,您应该在比较中使用 ===
而不是 ==
。参见 this。
正如其他人所说,您可以使用 filter()
来达到这个目的。最短路线是:
const array = [false, null, true, 0, NaN, undefined, "", "Hola Mundo"];
console.log(array.filter(Boolean));
.as-console {background-color:black !important; color:lime;}
.as-console-wrapper {max-height:100% !important; top:0;}
但是,回到您的代码,您应该注意到 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"]);
.as-console {background-color:black !important; color:lime;}
.as-console-wrapper {max-height:100% !important; top:0;}