javascript中常見的數組面試題

說在前面的話:

  • 數組的concat,join,slice,toString方法不會改變原數組。
  • 數組的splice,push,pop,unshift,shift,sort,reverse方法會改變原數組。

數組求和

要求:計算給定數組的所有元素的總和,數組的元素均爲Numeber,不考慮其它類型。

方法一:常規遍歷相加

for,for in, for of, forEach都可以遍歷數組!這裏我用了for in

function sum (arr) {
    var res = 0;
    for (var i in arr){
        res += arr[i]
    }
    return res
}
console.log(sum([1, 2, 3, 4]))

方法二: 遞歸!

var arr = [1, 2, 3, 4, 9]
function sum(arr) {
    var len = arr.length;
    if (len == 0) {
        return 0
    } else if (len == 1) {
        return arr[0]
    } else {
        return arr[0] + sum(arr.slice(1))
    }
}
console.log(sum(arr))

方法三: reduce()

reduce() 方法接收一個函數作爲累加器,數組中的每個值(從左到右)開始縮減,最終計算爲一個值。
reduce/map,filter,sort都是高階函數!可以接受函數作爲參數!(給高階大佬們倒茶!)關於用法我將專門寫一篇來說。

var arr = [1, 2, 2, 3, 22, 2]
function sum (arr) {
    var res = arr.reduce(function (total, num) {
        return  total + num
    })
    return res
}
console.log(sum(arr))

方法四: eval()

(發音:哎喔~~ )eval接受字符串,並計算其javascript代碼。黑科技啊有木有!但是不推薦用!

var arr = [1, 2, 3, 4, 5];
function sum(arr) {
    return eval(arr.join('+'))
}
console.log(sum(arr))

數組求最大值

其實數組的一些操作變來變去就那些。以不變應萬變,多寫寫,多思考,熟練了這些方法基本就可以應付一切數組的問題了!

方法一: for循環遍歷
簡單!取第一個元素,遍歷數組的元素挨個比較,取最大值!

var arr = [1, 2, 3, 4, 9]
function max(arr) {
    var res = arr[0]
    for (var i in arr) {
        res = Math.max(res, arr[i])
    }
    return res
}
console.log(max(arr ))

方法二: sort()和reverse()

思路很簡單,從大到小排序然後第一個元素就是最大值咯!(這裏我不明白爲什麼sort接受這樣一個函數就可以實現排序了呢?容我研究研究~~)

var arr = [1, 2, 3, 4]
var res = arr.sort((a, b) => b - a)[0]
console.log(res)
var res = arr.sort((a, b) => a - b).reverse()[0]

方法三: Math.max()

這個就很有意思了,apply可以劫持另一個對象的方法,也就是說可以繼承這個方法!這裏第一個參數null只是表示一個佔位符。類似的有Array.prototy.push.apply(arr1, arr2)。可以理解爲arr1劫持了push方法,傳入參數arr2。即爲arr1.push(arr2)。apply方法已經將arr2數組轉換爲參數列表,call跟apply的用法差不多,call是apply的語法糖。(我在考慮要不要單獨寫一偏關於apply,call,bind的用法)

var arr = [1, 2, 3, 4]
console.log(Math.max.apply(null, arr))

方法四: reduce()

var arr = [1, 2, 2, 3, 22, 2]
var max = arr.reduce(function (a, b) {return a > b ? a : b})
console.log(max)

方法五: eval()
(還是這個鬼東西!) 不廢話!上代碼!

 var arr = [1, 2, 3, 4]
 var max = eval('Math.max(' + arr + ')')
 console.log(max) //4
在這裏,arr不需要轉換成字符串再相加,因爲加號可以隱式的將數組對象轉成字符串。

數組合並

//concat 這個不用解釋了,簡單粗暴
function concat(arr1, arr2) {
    return arr = arr1.concat(arr2)
}
//slice和push 深拷貝一份arr1,遍歷arr2,push進去就OK了!
function concat(arr1, arr2) {
    var arr = arr1.slice(0);
    for (var i in arr2) {
        arr.push(arr2[i])
    }
    return arr
}
var arr1 = [1, 2];
var arr2 = [3, 4];
console.log(concat(arr1, arr2))
//slice,push,apply 跟上面用法差不多
function concat(arr1, arr2) {
    var arr = arr1.slice(0);
    Array.prototype.push.apply(arr, arr2)//[].push.apply(arr, arr2)也可以
    return arr
}
var arr1 = [1, 2];
var arr2 = [3, 4];
console.log(concat(arr1, arr2))
//for循環遍歷,分別push
function concat(arr1, arr2) {
    var arr = [];
    for (var i in arr1) {
        arr.push(arr1[i])
    }
    for (var j in arr2) {
        arr.push(arr2[j])
    }
    return arr  
}
var arr1 = [1, 2];
var arr2 = [3, 4];
console.log(concat(arr1, arr2))

數組中元素的相關操作

1.移除數組 arr 中的所有值與 item 相等的元素,直接在給定的 arr 數組上進行操作,並將結果返回

var arr = [1, 2, 2, 3, 4, 2]
  function sum(arr, item) {
      for (var i = 0; i < arr.length; i++) {
          if (arr[i] == item) {
                arr.splice(i, 1)
                i--
          }
      }
      return arr
  }
  console.log(sum(arr, 2))    // [1, 3, 4]
  console.log(arr)    //[1, 3, 4]

注意!因爲splice會改變原數組的長度,所以每次刪除之後i-1;在這裏不能用for in循環。因爲for in會遍歷對象的所有可枚舉屬性,並且原型上的屬性也會被訪問到,只要這個屬性是存在並且可枚舉的,他就會給你全部打印出來。而且for in性能最差,所以對於數組最好用for循環,處理對象用for in.
鏈接:for in循環和for循環的區別

2.在數組 arr 中,查找值與 item 相等的元素出現的所有位置

//forEach
var arr = [1, 2, 2, 3, 4, 2]
function fn(arr, item) {
    var res = [];
    arr.forEach(function (value, index) {
        return value !== item || res.push(index) //value == item && res.push(index)
    })
    return res
}
console.log(fn(arr, 2)) //[1, 2, 5]

3.找出數組 arr 中重複出現過的元素

//雙層遍歷。
var arr = [1, 2, 2, 3, 22, 2]
  function sum (arr) {
      var res = [];
      for (var i = 0; i <arr.length-1; i++) {
          for (var j = i + 1; j < arr.length; j++) {
              if (arr[i] === arr[j] && res.indexOf(arr[i]) == -1 ) { //判斷是否重複,是否放進新數組
                  res.push(arr[i])
              }
          }
      }
      return res
  }
  console.log(sum(arr))
//sort排序後遍歷相鄰的
var arr = [1, 2, 2, 3, 22, 2]
    function sum (arr) {
        var res = [];
        arr.sort();
        for (var i = 0; i < arr.length; i++) {
            if (arr[i] === arr[i+1] && res.indexOf(arr[i]) == -1) {
                res.push(arr[i])
            }
        }
        return res
    }
    console.log(sum(arr))
//filter
var arr = [1, 2, 2, 3, 22, 2]
    function sum (arr) {
        return arr.sort().filter(function(item, i) {
            return arr[i] == arr[i+1] && arr[i] !== arr[i-1]
        })
    }
    console.log(sum(arr))
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章