聊聊w3c刷題遇到的小坑

本文是lhyt本人原創(chuàng),希望用通俗易懂的方法來理解一些細(xì)節(jié)和難點(diǎn)。轉(zhuǎn)載時(shí)請(qǐng)注明出處。文章最早出現(xiàn)于本人github

0. 前言

近來很多人來問,去哪里刷題啊,我毫不猶豫回答w3c和??途W(wǎng),適合入門和進(jìn)階。然后,一些人就說了一些看起來好像能過卻總是過不了的題目,于是我去試一下,大概找到一些對(duì)于新人進(jìn)階遇到的可能有點(diǎn)小坑的題目。

1.正題

1.1刪除數(shù)組中特定值算法挑戰(zhàn)(初級(jí))

要求:刪除數(shù)組中的所有的假值。

js中,假值有false、null、0、""、undefined 和 NaN,加上本身的類型轉(zhuǎn)換機(jī)制,假值最終可以轉(zhuǎn)化為false!所以,一個(gè)個(gè)選的話就悲催了。

function bouncer(arr) {

for (var i = 0; i < arr.length; i++) {

if(!!arr[i] === false){

arr.splice(i,1);

i--;

}

}

return arr;

}

1.2對(duì)象搜索算法挑戰(zhàn)(中級(jí))

要求:寫一個(gè) function方法,它遍歷一個(gè)對(duì)象數(shù)組(第一個(gè)參數(shù))并返回一個(gè)包含相匹配的屬性-值對(duì)(第二個(gè)參數(shù))的所有對(duì)象的數(shù)組。如果返回的數(shù)組中包含 source 對(duì)象的屬性-值對(duì),那么此對(duì)象的每一個(gè)屬性-值對(duì)都必須存在于 collection 的對(duì)象中。注意:數(shù)組里面的對(duì)象出現(xiàn)的順序不一定和第二個(gè)參數(shù)剛好順序?qū)?yīng)

我這里用了ES6的Object.entries方法,返回一個(gè)數(shù)組,成員是參數(shù)對(duì)象自身的(不含繼承的)所有可遍歷屬性的鍵值對(duì)數(shù)組。

function where(collection, source) {

var arr = [];

var q = []

arr = collection.map(function(i){

return Object.entries(i).join()

})

_source = Object.entries(source)

var a = 0

for(var k = 0;k

for(var j = 0;j<_source.length;j++){

if(arr[k].indexOf(_source[j].join())!=-1){

a++

}

}

if(a == _source.length){

a = 0

q.push(collection[k])

}else{

a = 0

}

}

return q

}

也可以嘗試JSON.stringify

1.3質(zhì)數(shù)求和算法挑戰(zhàn)(中級(jí))

要求:求小于等于給定數(shù)值的質(zhì)數(shù)之和。

這里用到了求質(zhì)數(shù)的那個(gè)正則

function sumPrimes(num) {

var arr = []

var sum = 0

for (var i = 2 ;i < 1000;i++){

if(i<2?false:!/^(11+?)\1+$/.test(Array(i+1).join('1'))&&i<=num){

arr.push(i)

}

}

return arr.reduce(function(sum,n){

return sum += n

},0)

}

1.4最小公倍數(shù)算法挑戰(zhàn)(中級(jí))

要求:找到所提供參數(shù)的最小公倍數(shù),這兩個(gè)參數(shù)可以均勻分配,以及這些參數(shù)之間范圍內(nèi)的所有最小公倍數(shù)。

注意:范圍是兩個(gè)數(shù)字構(gòu)成的數(shù)組,兩個(gè)數(shù)字不一定按數(shù)字順序排序。

主要先了解最大公倍數(shù)和最小公約數(shù)的概念以及求法

function smallestCommons(arr) {

arr.sort(function(a,b){//先排序

return a-b

})

var n = arr[0]

var arr1 = []

var res

while(n<=arr[1]){//約數(shù)集合

arr1.push(n)

n++

}

function gcd( n,m ){

var qq = n*m //緩存兩個(gè)數(shù)的乘積

function yue(n,m){

if( m == 0 ) return n; //輾轉(zhuǎn)相除法

return yue( m, n % m );

}

return qq/yue(n,m)//最小公倍數(shù)=乘積/最大公約數(shù)

}

res = gcd(arr1[0],arr1[1] )//保留前面兩個(gè)數(shù)的結(jié)果

for(var i = 2;i < arr1.length;i++){//操作整個(gè)范圍所有的數(shù)

res = gcd(res,arr1[i])

}

return res

}

1.5數(shù)組平鋪算法挑戰(zhàn)

要求:對(duì)嵌套的數(shù)組進(jìn)行平鋪嵌套數(shù)組。你必須考慮到不同層級(jí)的嵌套。

這道題有點(diǎn)難度的,主要是處理{}和[],通過類型轉(zhuǎn)換處理

function steamroller(arr) {

if (typeof arr[0] != 'number') {//全字母的情況(在這里只是全數(shù)字或者全字母,準(zhǔn)確來說需要做更詳細(xì)的判斷)

return Array.apply(null,arr.join(',').split(','));

} else {

arr = arr.join().replace(/(,,)/g,',').split(',').map(function(n){//【】會(huì)轉(zhuǎn)為兩個(gè)逗號(hào),,要去掉一個(gè)最后空數(shù)組平鋪后就會(huì)不存在

return n*1;//轉(zhuǎn)數(shù)字類型,+n也是一樣

});

for (var i = 0;i

if(isNaN(+arr[i])){//如果是對(duì)象,對(duì)象轉(zhuǎn)數(shù)字類型結(jié)果是NaN(+{}==NaN)

arr[i] = {}

}

}

}

return arr

}

1.6函數(shù)迭代可選參數(shù)算法挑戰(zhàn)

要求:創(chuàng)建一個(gè)計(jì)算兩個(gè)參數(shù)之和的 function。如果只有一個(gè)參數(shù),則返回一個(gè) function,該 function 請(qǐng)求一個(gè)參數(shù)然后返回求和的結(jié)果。如果兩個(gè)參數(shù)都不是有效的數(shù)字,則返回 undefined。

這題類似于柯里化

function add() {

var sum = 0

var arr = [...arguments]

if(!arr.every(function(i){

return typeof i ==='number'//如果兩個(gè)參數(shù)都不是有效的數(shù)字

})){

return undefined

}

if(arguments.length != 1){//參數(shù)大于1個(gè)

arr.forEach(function(n){

sum+= n

})

return sum

}

sum = arguments[0]//一個(gè)參數(shù)的情況

return function(){

return typeof arguments[0] =='number'? sum += arguments[0]:undefined

}

}



原文來自lhyt的github

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容