2017-07-20 29 views
0

我很好奇,为什么否则,如果在过滤方法语句不返回任何东西:为什么if语句不会返回布尔类型和对象类型的值?

var moveZeros = function (arr) { 
    const nonZeros = arr.filter(value => { 
    if (value !== 0) return value 
    else if (typeof value === 'boolean') return value 
    else if (typeof value === 'object') return value 
    }) 

    const zeros = arr.toString().match(/0/g).map(Number) 

    const newArr = nonZeros.concat(zeros) 

    return newArr 
} 

另外,我也想知道为什么我得到类似的效果,当我试图筛选出零从一个数组:

const zeros = arr.filter(value => { 
    if (value === 0) return value 
}) 

这里是一个样本阵列测试功能:

[ 0, 1, null, 2, false, 1, 0 ] 

感谢您的帮助!

+0

你到底去做? 'filter'需要一个布尔值,你不需要返回值 – Psidom

+0

该函数的目的是将数组末尾的所有零移动,同时保留其他元素的顺序。这只是一个练习,但我想知道为什么过滤方法的行为如此。 –

+0

因为'0'是'falsey'。所以当你做'返回0'时,它和'return false'是一样的,这意味着它不会被添加。 – epascarello

回答

1

你并不需要在filter方法的返回值,返回的应该是真实的布尔如果该值应该选择,像这样:

var moveZeros = function (arr) { 
 
// also when you use !== 0, you don't need to check the type as it compares type 
 
    const nonZeros = arr.filter(value => value !== 0) 
 
    const zeros = arr.filter(value => value === 0) 
 

 
    const newArr = nonZeros.concat(zeros) 
 
    return newArr 
 
} 
 

 
console.log(moveZeros([ 0, 1, null, 2, false, 1, 0 ]));

+1

谢谢!这解决了这个问题。 –