1. 程式人生 > >JavaScript練習筆記整理·3 - 6.25

JavaScript練習筆記整理·3 - 6.25

fat 題目 最優 app pread 以及 值類型 循環 return

歡迎和大家一起來討論~ 基礎練習(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()方法可以替換字符串中的一個或多個值。 從這三天的練習來看,對於數組的各種方法也逐漸使用得熟練起來了。但是其他類型的各種方法還是一種挑戰。而我的解答也要從比較冗余的語句,寫出更為簡潔而有效的語句了。繼續加油吧!

JavaScript練習筆記整理·3 - 6.25