Falsy Bouncer(第二种解决方式)
<-- 要求說(shuō)明 -->
過(guò)濾數(shù)組假值
(真假美猴王)
刪除數(shù)組中的所有假值。
在JavaScript中,假值有false、null、0、""、undefined 和 NaN。
當(dāng)你完成不了挑戰(zhàn)的時(shí)候,記得開大招'Read-Search-Ask'。
這是一些對(duì)你有幫助的資源:
- Boolean Objects
- Array.filter()
?
<-- 自己理解 -->
這里的Boolean()是新知識(shí)點(diǎn),先學(xué)習(xí)了一下Boolean()方法:
new Boolean(value) ?// ?value可選
如果value值不是布爾值,則會(huì)將其轉(zhuǎn)換為布爾值。如果省略value,或者value的值為0,-0,null,false,NaN,undefined或者空字符串(“”),則生產(chǎn)的Boolean對(duì)象的值為false。如果傳入的參數(shù)是 DOM 對(duì)象??document.all,也會(huì)生成值為?false?的?Boolean?對(duì)象。任何其他的值,包括值為?"false"?的字符串和任何對(duì)象,都會(huì)創(chuàng)建一個(gè)值為?true?的?Boolean?對(duì)象。
注意:不要將基本類型中的?布爾值true和false?與?值為true和false的Boolean對(duì)象?弄混了。
當(dāng)Boolean對(duì)象用于條件語(yǔ)句的時(shí)候(直接應(yīng)用月條件語(yǔ)句),任何不是undefined和null的對(duì)象,包括值為false的Boolean對(duì)象,都會(huì)被當(dāng)做true來(lái)對(duì)待,如下面代碼:
var x = new Boolean(false); if(x){// 這里的代碼會(huì)被執(zhí)行 }基本類型的布爾值不受此規(guī)則影響,如下面代碼:
var x = false; if(x){// 這里的代碼不會(huì)被執(zhí)行 }不要用創(chuàng)建Boolean對(duì)象的方式將一個(gè)非布爾值轉(zhuǎn)化成布爾值,直接將Boolean當(dāng)做轉(zhuǎn)換函數(shù)來(lái)使用即可,如下面代碼:
var x = Boolean (expression ); // 推薦 var x = new Boolean( expression ) // 不太好如果在條件判斷語(yǔ)句中直接使用Boolean作為轉(zhuǎn)換函數(shù),代碼如下:
var x = Boolean( false ); if(x){// 這里的代碼不會(huì)被執(zhí)行 }?
該實(shí)例中可以使用Boolean對(duì)象將數(shù)組中的所有元素進(jìn)行判斷,Boolean對(duì)象返回false即為數(shù)組中的價(jià)值。
使用for循環(huán)進(jìn)行遍歷,將數(shù)組中的每一個(gè)值依次傳入Boolean函數(shù),返回false則對(duì)該值進(jìn)行刪除操作。
delete和splice()都可以實(shí)現(xiàn)數(shù)組刪除的操作,但是delete僅將值設(shè)為undefined,數(shù)組的length不變,這里需要使用splice()。
?
<-- 遇到的問(wèn)題 -->
無(wú)論使用for循環(huán)還是使用filter()都不會(huì)得到正確結(jié)果,恍然大悟,使用splice()刪除后,數(shù)組長(zhǎng)度發(fā)生變化,再次回到for循環(huán)或filter中,整個(gè)遍歷的會(huì)受到影響,會(huì)存在刪除一個(gè)后就會(huì)跳過(guò)一個(gè)值,是遍歷造成混亂。
?
<-- 代碼實(shí)現(xiàn) -->
解決方法一:
遇到的問(wèn)題主要是刪除前面的數(shù)組元素后,后面的索引值會(huì)前移,導(dǎo)致遍歷混亂,如果從后面開始遍歷,那么對(duì)前面的索引值就不會(huì)產(chǎn)生影響。代碼如下:
function bouncer( item ){for( var i=arr.length-1; i>=0; i-- ){if( Boolean( arr[i] ) == false ){arr.splice( i, 1 );}}return arr; }?
解決方法二:
filter()為數(shù)組中的每個(gè)元素調(diào)用一次?callback?函數(shù),并利用所有使得?callback?返回 true 或?等價(jià)于 true?的值?的元素創(chuàng)建一個(gè)新數(shù)組。
可以將數(shù)組每個(gè)值傳遞給Boolean,返回的true或false再作為filter()的callback的參數(shù),返回false不處理,返回true則將所對(duì)應(yīng)的值存入一個(gè)數(shù)組中,最后遍歷結(jié)束,將所有真值傳遞到一個(gè)數(shù)組中并return,等同于將價(jià)值刪除。
代碼實(shí)現(xiàn):
function bouncer( arr ){return arr.filter( function( item, index, array ){return Boolean( item );}) }?
?
<-- 知識(shí)點(diǎn)總結(jié) -->
Boolean()
filter()
delete和splice()刪除數(shù)組
轉(zhuǎn)載于:https://www.cnblogs.com/daleizi147/p/8445840.html
總結(jié)
以上是生活随笔為你收集整理的Falsy Bouncer(第二种解决方式)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 表的操作(Oracle和DB2)
- 下一篇: 【逆向知识】裸函数(Naked函数)