本文是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