2017-07-20 33 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

謝謝!這解決了這個問題。 –