Javascript 从数组中删除所有falsy值
我想从数组中删除所有falsy值。JavaScript中的Falsy值为false、null、0、“、未定义和NaNJavascript 从数组中删除所有falsy值,javascript,arrays,Javascript,Arrays,我想从数组中删除所有falsy值。JavaScript中的Falsy值为false、null、0、“、未定义和NaN 功能弹跳器(arr){ arr=arr.filter(函数(n){ 返回(n!==未定义的&&n!==空&&n!==假&&n!==0&&n!==“”&&isNaN()!=NaN);}); 返回arr; } 保镖([7,“吃了”,“错了,9,不吃],); 除NaN测试用例外,以上所有测试都得到了满足。有人能帮我检查数组中是否包含NaN吗?既然你想去掉“falsy”值,就让Java
功能弹跳器(arr){
arr=arr.filter(函数(n){
返回(n!==未定义的&&n!==空&&n!==假&&n!==0&&n!==“”&&isNaN()!=NaN);});
返回arr;
}
保镖([7,“吃了”,“错了,9,不吃],);
除NaN测试用例外,以上所有测试都得到了满足。有人能帮我检查数组中是否包含NaN吗?既然你想去掉“falsy”值,就让JavaScript来做吧:
function bouncer(arr) {
return arr.filter(function(v) { return !!v; });
}
的双重应用当值为“truthy”时,code>运算符将使过滤器回调返回true
;当值为“falsy”时,将使过滤器回调返回false
(您的代码正在调用isNaN()
,但没有向其传递值;这就是为什么该测试对您无效。isNaN()
函数在强制为数字时,如果其参数为NaN
,则返回true
,否则返回false
)
编辑-注意
function bouncer(arr) {
return arr.filter(Boolean);
}
也会像LoremIpsum在另一个答案中指出的那样工作,因为内置的布尔构造函数做的事情与几乎完全相同代码>您可以使用布尔值:
var myFilterArray = myArray.filter(Boolean);
你用错了isNaN()
。它应该是如下所示:
function bouncer(arr) {
return arr.filter(function (n) {
return n !== undefined && n !== null && n !== false && n !== 0 && n !== "" && !isNaN(n);
});
}
您还可以重写它:
function bouncer( arr ){
return arr.filter( function( value ){
return value;
});
}
这是另一个等效但具有说明性的解决方案:
function bouncer( arr ){
return arr.filter( function( value ){
return value ? true : false;
});
}
此代码示例是说明性的,因为它向读取器指示变量值
将被计算为truthy或false,并且匿名函数将返回一个布尔值,真
或假
,映射到值
的计算
对于不熟悉这种基于真实性从数组中删除值的方法的人,或者对于不熟悉(或没有阅读过有关过滤器
函数的文档的人,此示例是最简洁的,它仍然传达了过滤器
函数的行为
import _ from 'lodash' // or import _ from 'underscore'
_.compact([0, 1, false, 'hello', '', {}, null]) // returns [1, 'hello', {}]
当然,在您的应用程序中,您可能会选择更简洁但缺乏洞察力的实现:
function bouncer( arr ){
return arr.filter( function( value ){
return value;
});
}
我知道这可以使用arr.filter()方法完成。但是我更喜欢使用Boolean()函数。对我来说更清楚。我是这样做的,虽然时间稍长:
function bouncer(arr) {
// Don't show a false ID to this bouncer.
var falsy;
var trueArr = [];
for (i = 0; i < arr.length; i++) {
falsy = Boolean(arr[i]);
if (falsy === true) {
trueArr.push(arr[i]);
}
}
return trueArr;
}
bouncer([7, "ate", "", false, 9]);
// returns a new array that is filtered accordingly.
功能弹跳器(arr){
//不要向这个保镖出示假身份证。
var falsy;
var-trueArr=[];
对于(i=0;i
^你就是这样做的我认为这样做比较划算
function bouncer(arr) {
arr = arr.filter(function(item) {
return item;
return arr;
bouncer([7, "ate", "", false, 9, NaN, undefined, 0]);
函数弹跳器(arr){
var结果=[];
对于(变量i=0;i
弹跳器功能:
功能弹跳器(arr){
返回arr.filter((val)=>{
返回!!val;
});
}
log(bouncer([7,“ate”,false,9])代码>感谢上面的所有工作答案。这里有三种解决问题的方法。第三个解决方案通过您的方法@Vignesh解决了问题
1.
function bouncer(arr) {
return arr.filter( function( val ){
return val;
});
}
2.
function bouncer(arr) {
return arr.filter(Boolean);
}
3.
function bouncer(arr) {
return arr.filter(function(val){
return val !== false && val !== "" && !(Number.isNaN(val)) && val !==
undefined && val !== 0 && val !== null;
});
}
这是我的想法
功能弹跳器(arr){
//不要向这个保镖出示假身份证。
var结果=[];
功能良好(obj){
if(!Boolean(obj)){
返回false;
}否则{
返回true;
}
}
对于(变量i=0;i log(bouncer([7,“ate”,false,9])代码>这应该是您正在寻找的:
let array = [7, 'ate', '', false, 9, NaN];
function removeFalsyItems(array) {
// Your result
let filter = array.filter(Boolean);
// Empty the array
array.splice(0, array.length);
// Push all items from the result to our array
Array.prototype.push.apply(array, filter);
return array
}
removeFalsyItems(array) // => [7, 'ate', 9], funny joke btw...
使用过滤器我们可以写
function bouncer(arr) {
return arr.filter(item => item);
}
bouncer([false, null, 0, NaN, undefined, ""]) // will return [].
尝试使用过滤器和布尔值:
let array = [7,"ate","",false,9];
array.filter((values) => {return Boolean(values) === true })
使用此简单过滤器可以:
array.filter(布尔值)
您可以阅读有关布尔值的更多信息,只需两次求反即可“强制转换”为布尔值<代码>!NaN===true
=>!!NaN===false
const truthy = arr.filter(o => !!o)
它将返回[]。我看你从未接受过答案。问题是您依赖Logger.log或console.log查看null删除是否有效?我认为@LoremIpsum建议的过滤器是最干净的解决方案
const src2DArr = [[34], [75], [30], [48], [976], [], [178], [473], [51], [75], [29], [47], [40]];
Logger.log("src2DArr: " +JSON.stringify(src2DArr));
// [[34],[75],[30],[48],[976],[],[178],[473],[51],[75],[29],[47],[40]]
var src2DArr1 = src2DArr.filter(Boolean);
Logger.log("src2DArr1: " + JSON.stringify(src2DArr1));
// [[34],[75],[30],[48],[976],[],[178],[473],[51],[75],[29],[47],[40]]
如果您喜欢使用JS实用程序库,如或,您可以使用compact
函数
import _ from 'lodash' // or import _ from 'underscore'
_.compact([0, 1, false, 'hello', '', {}, null]) // returns [1, 'hello', {}]
文档:
上述代码工作正常。。。你能解释一下在返回arr.filter(函数(值){return value;})中发生了什么吗@Vignesh Array.prototype.filter检查值是否为truthy,然后将其添加到数组中。上面的所有值都不是真的在第一种情况下,筛选器正在删除字符串,即使它们不是空的,为什么?大括号禁用隐式返回,所以您将得到空数组。x?真:假
总是多余的<代码>返回值
就足够了。在某些情况下,您需要使用布尔(值)
或!!值
,但不是这种情况。我写这个答案是因为它说明了过滤器
根据布尔返回值计算值。没有明确说明filter
将回调的返回值计算为布尔值,然后返回值
不足以向过滤器
功能的新手表达概念。非常好。函数方法的好技巧{return!!v;}与{return v;}不一样吗?从技术上讲,您甚至不需要这里的code>是因为filter
测试的是真实性,而不是与true
的比较。这是一个聪明的方法布尔是布尔的构造函数。这相当于var myfilterray=myArray.filter((v)=>new Boolean(v))代码>。如果给定值为0
,
let array = [7,"ate","",false,9];
array.filter((values) => {return Boolean(values) === true })
const truthy = arr.filter(o => !!o)
myArray = [false, null, 0, NaN, undefined, ""];
myArray.map(item => {
//if you want you can write logic
console.log(item);
})
// Get rid of bad values
.filter(Boolean);
const src2DArr = [[34], [75], [30], [48], [976], [], [178], [473], [51], [75], [29], [47], [40]];
Logger.log("src2DArr: " +JSON.stringify(src2DArr));
// [[34],[75],[30],[48],[976],[],[178],[473],[51],[75],[29],[47],[40]]
var src2DArr1 = src2DArr.filter(Boolean);
Logger.log("src2DArr1: " + JSON.stringify(src2DArr1));
// [[34],[75],[30],[48],[976],[],[178],[473],[51],[75],[29],[47],[40]]
import _ from 'lodash' // or import _ from 'underscore'
_.compact([0, 1, false, 'hello', '', {}, null]) // returns [1, 'hello', {}]