《数组相关》

72 阅读2分钟

数组去重

使用Set

// 方法一 利用set去重  
var arr = [11'a''a'];  
var set = new Set(arr);  
console.log(Array.from(set))  // [1, 'a']  

使用Map

var map = new Map();  
arr.forEach(item => {  
  map.set(item)  
})  
console.log(Array.from(map.keys()))

利用对象键值唯一

var arr = [11'a''a'];  
var obj = {}  
for (const value of arr) {  
  obj[value] = value;  
}  
console.log(Object.keys(obj))   // [1, 'a']  

使用双重for循环

var arr = [11'a''a'];  
for (let i = 0; i < arr.length; i++) {  
  for(let j = 0; j < arr.length; j++){  
    if(i != j && arr[i] === arr[j]){  
      arr.splice(j, 1);  
      j--  
    }  
  }  
}  

使用indexOf()

var arr = [11'a''a'];  
var arr2 = [];  
for (let i = 0; i < arr.length; i++) {  
  if(arr2.indexOf(arr[i]) === -1){  
    arr2.push(arr[i])  
  }  
}  
console.log(arr2)    

使用filter()

var arr = [11'a''a'];  
// 方法五 
let newArr = arr.filter((item, index) => arr.indexOf(item) === index);    
// 这个相当巧妙,遍历数组,当前数值第一次出现时的索引和遍历时的索引一致时,才筛选  
// [1, 1, 'a', 'a']   
// 1 --> indexOf:0 index:0 true   
// 1 --> indexOf:0 index:1 false  
// 'a' -> indexOf:2 index:2 true  
// 'a' -> indexOf:2 index:3 true  
// 结果:[1, 'a']  
console.log(newArr)  

重写数组方法

push()

// push实现末尾添加  返回长度,改变原数组
Array.prototype.myPush = function(){
    for (let index = 0; index < arguments.length; index++) {
      this[this.length] = arguments[index]
    }
    return this.length
}

unshift()

// unshift实现首位添加,返回长度,改变原数组
Array.prototype.myUnShift = function(){
    var len = this.length + arguments.length; 
    for (let index = len; index > 0; index--) {
      // 旧数据依次向后移动
      if(index > arguments.length){
        this[index - 1] = this[index - arguments.length - 1];
      }else{
        this[index - 1] = arguments[index - 1];
      }
    }
    return this.length;
}

pop()

// pop 实现末尾删除,返回被删除元素,改变原数组
Array.prototype.myPop = function(){
    const value = this[this.length - 1];
    this.length--;
    return value;
}

shift()

// shift 实现首位删除,返回被删除元素,改变原数组
Array.prototype.myShift = function(){
    const value = this[0];
    for (let index = 0; index < this.length - 1; index++) {
      this[index] = this[index + 1];
    }
    this.length--;
    return value
}

reverse()

// reverse 实现数组反转
Array.prototype.myReverse = function(){
    var last = this.length - 1;
    for(var i = 0; i < this.length; i++){
      var temp = this[i];
      this[i] = this[last];
      this[last] = temp;
      if(i === last || last - i === 1){ // 只剩一个(中间)|| 两侧数字已交换完毕
        break;
      }
      last--;
    }
    return this;  
}

排序

冒泡排序

var arr = [1,2,3,45678];  
  var arr1 = [1,32,45,65,6463,754]
  //执行总次数
  for(var i = 0; i < arr1.length - 1; i++){
    // 每次比较的趟数
    for(var j = 0; j < arr1.length - i - 1; j++){
      if(arr1[j] > arr1[j+1]){
        var temp = arr1[j]
        arr1[j] = arr1[j+1];
        arr1[j+1] = temp;
      }
    }
  }

其它

将一个有序数组乱序返回

var arr = [123456];
arr.sort(function(){
   return Math.random() - 0.5; 
});

类数组操作

var obj = {
    '1' : 'a',
    '2' : 'b',
    '3' : 'c',
    'length' : 3// 基础长度为3
    'push' : Array.prototype.push
}
obj.push('d');    // 第一次 push,length为3 --> obj[3] = 'd'  length++
obj.push('e');    // 第二次 push, length为4 --> obj[4] = 'e'  length++
console.log(obj.length);  // 5
console.log(obj);   // {1: 'a', 2: 'b', 3: 'd', 4: 'e', length: 5, push: ƒ}