我想从数组中删除所有虚假值。 JavaScript中的Falsy值为false,null,0,“”,undefined和NaN。
function bouncer(arr) {
arr = arr.filter(function (n) {
return (n !== undefined && n !== null && n !== false && n !== 0 && n !== "" && isNaN()!=NaN); });
return arr;
}
bouncer([7, "ate", "", false, 9, NaN], "");
除了NaN测试用例之外,以上所有人都满意。有人可以帮我检查数组是否包含NaN吗?
答案 0 :(得分:102)
您可以使用布尔值:
var myFilterArray = myArray.filter(Boolean);
答案 1 :(得分:51)
因为你想摆脱" falsy"值,让JavaScript做它的事情:
function bouncer(arr) {
return arr.filter(function(v) { return !!v; });
}
!
运算符的双重应用会在值为" truthy"时使过滤器回调返回true
。和false
当它是" falsy"。
(您的代码正在调用isNaN()
但未向其传递值;这就是为什么该测试对您不起作用。isNaN()
函数返回true
如果其参数在强制转换为数字时为NaN
,则为false
。)
编辑 - 请注意
function bouncer(arr) {
return arr.filter(Boolean);
}
也可以像LoremIpsum在另一个答案中注意到的那样,因为内置的布尔构造函数与!!
完全相同。
答案 2 :(得分:18)
truthyArray = arr.filter(el => el)
^你是怎么做的
答案 3 :(得分:9)
您以错误的方式使用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;
});
}
}
你也可以改写它:
df2
答案 4 :(得分:6)
答案 5 :(得分:3)
这是另一个等效的解释性解决方案:
function bouncer( arr ){
return arr.filter( function( value ){
return value ? true : false;
});
}
此代码示例是说明性的,因为它向读者指示变量value
将被评估为真或假,并且匿名函数将返回布尔值,true
或{{1} },映射到false
的评估。
对于不熟悉这种基于其真实性从数组中删除值的方法的人,或者对于value
函数不熟悉(或未阅读过文档)的人,本示例是最简洁的仍然传达filter
函数的行为。
当然,在您的应用程序中,您可以选择更简洁但不太富有洞察力的实现:
filter
答案 6 :(得分:3)
我知道这可以使用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.
答案 7 :(得分:2)
保镖功能:
function bouncer(arr) {
return arr.filter((val) => {
return !!val;
});
}
console.log(bouncer([7, "ate", "", false, 9]));
答案 8 :(得分:2)
感谢上面的所有工作答案。以下是解决问题的3种方法。第三种解决方案通过您的方法解决问题@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;
});
}
答案 9 :(得分:2)
我认为这样做更好
function bouncer(arr) {
arr = arr.filter(function(item) {
return item;
return arr;
bouncer([7, "ate", "", false, 9, NaN, undefined, 0]);
答案 10 :(得分:1)
这是我的想法......
function bouncer(arr) {
// Don't show a false ID to this bouncer.
var result = [];
function isGood(obj){
if(!Boolean(obj)){
return false;
} else {
return true;
}
}
for (var i=0; i < arr.length; i++){
if (isGood(arr[i]) === true){
result.push(arr[i]);
}
}
return result;
}
console.log(bouncer([7, "ate", "", false, 9]));
&#13;
答案 11 :(得分:1)
使用过滤器,我们可以编写
function bouncer(arr) {
return arr.filter(item => item);
}
bouncer([false, null, 0, NaN, undefined, ""]) // will return [].
答案 12 :(得分:0)
使用.filter
myArray.filter(val => Boolean(val));
答案 13 :(得分:0)
我看到您从未接受答案。您是依赖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]]
答案 14 :(得分:0)
如果您喜欢使用 Lodash 或 Underscore.js 等 JS 实用程序库,您可以使用 compact
函数。
import _ from 'lodash' // or import _ from 'underscore'
_.compact([0, 1, false, 'hello', '', {}, null]) // returns [1, 'hello', {}]
答案 15 :(得分:0)
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);
它将返回[]。
答案 16 :(得分:0)
只需两次否定“转换”为布尔值。 True
True
=> !NaN === true
!!NaN === false
答案 17 :(得分:0)
尝试使用过滤器和布尔值:
let array = [7,"ate","",false,9];
array.filter((values) => {return Boolean(values) === true })
答案 18 :(得分:0)
这应该是您想要的:
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...
答案 19 :(得分:0)
function bouncer(arr) {
function filterFalse(value) {
var a = Boolean(value);
if (a === true) {
return a;
}
return a;
}
function filterArray(x) {
var y = filterFalse(x);
if (y) {
return true;
} else {
return false;
}
}
var newArr = arr.filter(filterArray);
return newArr;
}
bouncer([1, null, NaN, 2, undefined]);
答案 20 :(得分:0)
function removeFalsy(value){
var val = Boolean(value);
if(!val)
return false;
return true;
}
function bouncer(arr) {
return arr.filter(removeFalsy);
}
bouncer([7, "ate", "", false, 9]);
答案 21 :(得分:0)
function falsy(value) {
if (value) {
return value;
}
}
function bouncer(arr) {
var filter = arr.filter(falsy);
return filter;
}
bouncer([7, "ate", "", false, 9]);
答案 22 :(得分:0)
function bouncer(arr) {
var result = [];
for (var i = 0; i < arr.length; i++) {
if (arr[i]) {
result.push(arr[i]);
}
}
return result;
}
bouncer([7, "ate", "", false, 9]);
答案 23 :(得分:-1)
lodash可以很好地完成此任务,其中有一个 _.compact() 函数。
const arr = [7, "ate", "", false, 9, NaN];
console.log(_.compact(arr));
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.js"></script>
答案 24 :(得分:-1)
function bouncer(arr) {
// Don't show a false ID to this bouncer.
for (var i = 0; i < arr.length; i++) {
if (!arr[i]) {
arr.splice(i, 1);
i = i-1;
}
}
return arr;
}
bouncer([7, "ate", "", false, 9]);