面試必問之【數組】篇

所謂數組就是值的有序集合,js數組元素能夠是任意類型,而且是動態的,根據須要它們會增加或縮減,js數組是js對象的特殊形式,數組索引碰巧是整數的屬性名差很少vue

建立數組

  1. 直接量的方式
  2. new Array() //一個數值參數是指定長度 多個參數是顯示的指定元素
var a = new Array();
var a = new Array(10);   //長度爲10的數組
var a = new Array(10, 2, 'a', 'b'); // [10, 2, 'a', 'b']
複製代碼

數組常見方法

  1. 添加和刪除
//shift unshift
//pop push
// splice() //俗稱數組萬能方法 插入,刪除和替換
複製代碼
  1. 其餘經常使用方法
//Array.join();  //String.split() 操做相反
//Array.reverse();   //改變了原數組 返回值也是翻轉後的數組
//Array.sort();   //改變了原數組 返回值也是翻轉後的數組
//Array.concat();   //不會改變原來的數組
//若是這些參數中的任何一個自身是數組,
//則鏈接的是數組的元素,而非數組自己。但要注意,concat()不會遞歸扁平化數組的數組。
var a = [1, 2, 3];
a.concat(4, [5, [6, 7]])   //返回[1, 2, 3, 4, 5, [6, 7]]

//Array.slice()   //參數爲開始和結束的位置,返回一個數組,不會改變原來的數組
複製代碼
  1. es6中新增的數組方法
//forEach  //注意forEach中不能使用break
//map     //返回一個映射的新數組
//filter  //返回知足條件造成的新數組
//every和some //返回 true或者false
//reduce  //使用指定的函數將數組元素進行組合,生成單個值  兩個參數 一個是化簡函數一個是初始值 其中初始值就是化簡函數第一次執行時的第二個參數y,若是沒有初始值,那麼將使用數組的第一個元素當初始值
let arr = [2, 4, 6, 9]
//數組求和
arr.reduce(function(x,y){   //化簡函數的參數: 
//toal必選 初始值或者化簡後的值, 
//currentValue必選 當前值, 
//currentIndex可選當前索引, 
//arr可選。當前元素所屬的數組對象。
    return x*y
},1)
//數組求積

複製代碼

判斷是不是一個數組

  1. Array.isArray()
  2. [] instanceof Array()
  3. toString()
var isArray = function(o){
    return typeof o === "object" && Object.prototype.toString.call(o) === "[object Array]"
}
複製代碼

數組排序

  1. 冒泡排序
function popSort(arr){
    for(var i = 0; i<arr.length-1; i++) {
        for(var j=0;j<arr.length-1-i;j++) {
            if(arr[j] > arr[j+1]) {
                let temp = arr[j];
                arr[j] = arr[j+1];
                arr[j+1] = temp;
            }
        }
        
    }
    return arr
}
複製代碼
  1. 選擇排序
function secSort(arr){
    for(var i = 0; i<arr.length; i++) {
        let min = arr[i];
        let minIndex = i;
        for(var j=i; j<arr.length; j++) {
            if(min > arr[j]) {
                min = arr[j]
                minIndex = j
            }
        }
        let temp = min;
        arr[minIndex] = arr[i]
        arr[i] = temp;
        
        
    }
    return arr
}
複製代碼
  1. sort
var arr = [4,3,6,5,7,2,1];
arr.sort();
arr.sort(function(a,b){   //a-b升序
    return a-b;
});
console.log(arr);
複製代碼

數組去重

  1. ES6 提供了新的數據結構 Set
const s = new Set();

[2, 3, 5, 4, 5, 2, 2].forEach(x => s.add(x));

for (let i of s) {
  console.log(i);
}
// 2 3 5 4
複製代碼
//去除數組的重複成員
let arr1 = [2,3,5,2,4,4,5]
console.log([...new Set(arr1)]);
//[ 2, 3, 5, 4 ]
複製代碼
  1. 利用對象的屬性不能重複
let arr = [2,3,5,2,4,4,5]
let obj = {};
for(let i = 0;i<arr.length;i++) {
    obj[arr[i]] = 1;
}
console.log(Object.keys(obj))  //[ '2', '3', '4', '5' ]  變成了字符串
複製代碼
  1. 比較去重
let arr = [2,3,5,2,4,4,5]
for(let i = 0;i<arr.length;i++) {
    for(let j = i+1;j<arr.length;j++) {
        if(arr[i] === arr[j]) {
            arr.splice(j,1)
            i--
        }
    }
}
console.log(arr)
複製代碼

經過上面的第2個解法引起了思考,若是數組裏面有對象呢,解決辦法就是在每一次遍歷前都須要判斷一下類型,若是是對象就單獨push進另外一個數組裏,而後經過解構或者concat從新結合成新數組須要特別說明的是 set很是強大,向 Set 加入值的時候,不會發生類型轉換,優先採用1和3, 2通常不用 用的話也須要特殊處理,補充 若是真想用的話,不用對obj了,特殊處理較爲複雜,採用map吧es6

let arr = [2,3,5,2,4,4,5]
let map = new Map();
for(let i = 0;i<arr.length;i++) {
    map.set(arr[i],1)
}
console.log([...map.keys()]) //[ 2, 3, 5, 4 ]
複製代碼

將類數組轉爲數組

  1. Array.from()
  2. [...arr]

補充 vue相關的

vue中如下不能檢測到數據變化數組

  1. this.arr[i] = 'xxx'
  2. this.arr.length = 10 解決辦法:
  3. this.arr.splice()
  4. this.$set(this.arr,index,val)

以上就是本身總結的一些有關數組常問的問題,部分給出了答案!固然有一些不足和不完善之處,歡迎各位指出!bash

相關文章
相關標籤/搜索