今天的知識點主要是數組的迭代方法中的一種filter()方法、數組操作方法中的concat()方法以及字元串的replace()方法。filter()方法可用於使用函數判斷數組中各項的值中返回true值的結果所組成的數組。concat()可以複製和創建新數組。而replace()方法可以替換字元串中... ...
歡迎和大家一起來討論~ 基礎練習(1): 我的解答為:
function array_diff(a, b) { if (b == "") return a; return a.filter(function(item,index,array) { var flag = false; for(var i=0;i<b.length;i++) { if(item !== b[i]) flag = true; } return flag; }); }
較優解答為:
function array_diff(a, b) { return a.filter(function(x) { return b.indexOf(x) == -1; }); }
分析:
對數組a使用filter()方法,迭代判斷數組a中的值是否存在於數組b中。當x的值,即數組a的值不能在數組b中找到時,b.indexOf()方法將返回-1。數組的filter()方法是指對數組中的每一項運行給定函數,返回該函數會返回true的項組成的的數組。 我的思路就稍微想得複雜了,對數組進行迭代的方法filter()是想到了,卻沒有好好地利用起來,函數內的判斷方法不夠簡潔,也沒有想到可以使用indexOf()方法進行判斷。筆記:
filter()方法,是指對數組中的每一項運行給定函數,返回該函數會返回true的項組成的的數組。利用指定的函數確定是否在返回的數組中包含某一項。 使用例子: var numbers = [1,2,3,4,5,4,3,2,1]; var filterResult = numbers.filter(function(item,index,array) { return (item>2); }); alter(filterResult); //[3,4,5,4,3] 數組的迭代方法真的很常用的,用於對某個數組迴圈某一操作。這些迭代方法要比for迴圈語句簡單很多,要記住! 共有五個迭代方法:every()、filter()、forEach()、map()、some()。基礎練習(2): 我的解答為:
var gimme = function (inputArray) { var newArray = []; for(var i=0;i<inputArray.length;i++) { newArray[i] = inputArray[i]; } newArray.sort(function(a,b) { if(a < b) { return -1; } else if (a> b) { return 1; } else { return 0; } }); return inputArray.indexOf(newArray[1]); };
較優解答為:
function gimme(a) { return a.indexOf(a.concat().sort(function(a, b) { return a - b })[1]) }
分析:
在較優解答中,對原數組使用了concat()方法,該方法可以將原數組複製並創建一個新數組。接著對新數組進行排序,並對於中間值求得索引值。 我的思路和最優解是一樣的,而實現方法還是稚嫩了一些。對於創建新數組不知道可以使用concat()方法進行快速地複製,也說明對基礎知識的熟悉程度不夠了。另外排序方法中,原來可以直接使用“return a-b”,我的方法就顯得很累贅了。筆記:
concat()方法可基於當前數組中的所有項創建一個新數組。該方法會先創建當前數組的一個副本,將接收到的參數添加到這個副本的末尾,最後返回新構建的數組。在沒有給concat()方法傳遞參數的情況下,它只是複製。若傳遞給concat()方法的是一個或多個數組,則該方法會將這些數組中的每一項都添加到結果數組中。若傳遞值不是數組,則添加到結果數組的末尾。 使用例子: var colors = ["red","green","blue"]; var colors = colors.concat("yellow",["black","brown"]); alert(colors); // red,green,blue alert(colors); // red,green,blue,yellow,black,brown 重排序方法:使用sort()方法可以進行排序,但仍可能會出現一些問題,因此使用比較函數,可以避免這個問題。 對於大多數數據類型可使用,只需要將其作為參數傳遞給sort()方法即可: function compare(value1,value2) { if(value1 < value2) { return -1; } else if (value1> value2) { return 1; } else { returm 0; } } 對於數值型或其他valueOf()方法會返回數值類型的對象類型,可以使用更簡單的比較函數: function compare(value1,value2) { return value2 - value1; }基礎練習(3): 我的解答為:
function minMax(arr){ var newarr = []; newarr.push(Math.min.apply(Math,arr)); newarr.push(Math.max.apply(Math,arr)); return newarr; }
較優解答為:
function minMax(arr){ return [Math.min(...arr), Math.max(...arr)]; }
分析:
這道題目就很簡單了,較優解答中的擴展語法( spread syntax)也在練習一中提及了。我的寫法還是太謹慎了,是不是應該大膽一些呢?基礎練習(4): 我的解答為:
function XO(str) { var str = str.toLowerCase(); var countx = 0; var counto = 0; for(var i=0;i<str.length;i++) { if(str[i] === "x") { countx++; } if(str[i] === "o") { counto++; } } if(counto == countx) { return true; } else { return false; } }
較優解答為:
function XO(str) { var a = str.replace(/x/gi, ''), b = str.replace(/o/gi, ''); return a.length === b.length; }
分析:
較優解使用的是replace()方法,結合正則表達式的使用,對原字元串str分別將x和o用空字元串替換得到a和b字元串,比較a和b字元串的長度,從而得到結果。我的解答方法呢,因為實在想不到可以使用什麼方法,所以用的最原始的方法,仿佛自己在做C語言的題目。 筆記: replace()方法,該方法接受兩個參數,一個參數可以是一個RegExp對象或者一個字元串,第二個參數可以是一個字元串或者是一個函數。若第一個參數是字元串,指揮替換第一個子字元串。要想替換所有子字元串,是提供一個正則表達式,並且指定全局標誌。 使用例子: var text = "cat,bat,sat,fat"; var result = text.replace("at","ond"); alert(result); //"cond,bat,sat,fat" result = text.replace(/at/g,"ond"); alert(result); //"cond,bond,song,fond"總結: 今天的知識點主要是數組的迭代方法中的一種filter()方法、數組操作方法中的concat()方法以及字元串的replace()方法。filter()方法可用於使用函數判斷數組中各項的值中返回true值的結果所組成的數組。concat()可以複製和創建新數組。而replace()方法可以替換字元串中的一個或多個值。 從這三天的練習來看,對於數組的各種方法也逐漸使用得熟練起來了。但是其他類型的各種方法還是一種挑戰。而我的解答也要從比較冗餘的語句,寫出更為簡潔而有效的語句了。繼續加油吧!