数组及数组对象的一些用法(持续更新中···)

148 阅读7分钟

1.数组去重

方法一:双重for循环+splice()方法

   let arr = ['a', 'a', '1', 3, 2, 2, 3, 1, 'b', 6, 7, 1, 'a']
   function unique(arr) {
       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)
                   j--
               }
           }
       }
       return arr
   }
   console.log(unique(arr))  //['a', '1', 3, 2, 1,'b', 6, 7]

方法二:创建一个新数组,并存放原数组的第一个元素,然后将元素组一一和新数组的元素对比,若不同则存放在新数组中。

   function unique2(arr) {
        let newArr = [arr[0]]
        for (let i = 1; i < arr.length; i++) {
            let flag = false;
            for (let j = 0; j < newArr.length; j++) {
                if (arr[i] === newArr[j]) {
                    flag = true;
                    break;
                }
            }

            if (!flag) {
                newArr.push(arr[i])
            }
        }
        return newArr;
    }
    console.log(unique2(arr)) //['a', '1', 3, 2, 1,'b', 6, 7]

方法三:创建一个新数组+数组的indexOf

  function unique3(arr) {
       let newArr = []
       for(let i=0;i<arr.length;i++){
           if(newArr.indexOf(arr[i])===-1){
               newArr.push(arr[i])
           }
       }
       return newArr
   }
   console.log(unique3(arr)) //['a', '1', 3, 2, 1,'b', 6, 7]

方法四:创建一个新数组+数组的lastIndexOf

function unique4(arr) {
     let newArr = []
     for (let i = 0; i < arr.length; i++) {
         if (newArr.lastIndexOf(arr[i]) === -1) {
             newArr.push(arr[i])
         }
     }
     return newArr
 }
 console.log(unique4(arr)) //['a', '1', 3, 2, 1,'b', 6, 7]

方法五:创建一个新数组+数组的includes

  function unique5(arr) {
      let newArr = []
      for (let i = 0; i < arr.length; i++) {
          if (!newArr.includes(arr[i])) {
              newArr.push(arr[i])
          }
      }
      return newArr
  }
  console.log(unique5(arr)) //['a', '1', 3, 2, 1,'b', 6, 7]

方法六:创建一个新数组+数组的forEach+includes

    function unique6(arr) {
        let newArr = []
        arr.forEach(item=>{
            if (!newArr.includes(item)) {
                newArr.push(item)
            }
        })
        return newArr
    }
    console.log(unique6(arr)) //['a', '1', 3, 2, 1,'b', 6, 7]

方法七:创建一个新数组+数组的filter+includes

   function unique7(arr) {
        let newArr = []
        arr.filter(item=>{
            if (!newArr.includes(item)) {
                newArr.push(item)
            }
        })
        return newArr
    }
    console.log(unique7(arr)) //['a', '1', 3, 2, 1,'b', 6, 7]

方法八:创建一个新数组+ES6的Set

  function unique8(arr) {
        return Array.from(new Set(arr))
    }
    console.log(unique8(arr)) //['a', '1', 3, 2, 1,'b', 6, 7]

2.数组对象根据某一个属性的值去重

    let arr = [
        { id: 1, name: 'shy' },
        { id: 2, name: 'orton' },
        { id: 1, name: 'join' },
        { id: 3, name: 'cena' },
        { id: 2, name: 'belly' },
        { id: 1, name: 'randy' },
    ]

方法一:reduce()

    function unique(arr, type) {
        let obj = {}
        arr=arr.reduce((item, next) => {
            obj[next[type]] ? '' : obj[next[type]] = true && item.push(next)
            return item
        }, [])
        return arr
    }
**方法二:filter()+has()+set()**
    function unique(arr, type) {
            const res = new Map();
            return arr.filter((item) => !res.has(item[type]) && res.set(item[type], 1));
        }
    console.log(unique(arr, 'id'))

3.数组对象根据多个属性的值去重

    let arr = [
        { id: 1, name: 'shy', age: 24 },
        { id: 2, name: 'orton', age: 20 },
        { id: 1, name: 'join', age: 22 },
        { id: 3, name: 'cena', age: 23 },
        { id: 2, name: 'belly', age: 21 },
        { id: 1, name: 'randy', age: 24 },
    ]

方法一:reduce()

    function unique(arr, type,type2) {
        let obj = {}
        arr=arr.reduce((item, next) => {
            obj[next[type].toString()+next[type2].toString()] ? '' : obj[next[type].toString()+next[type2].toString()] = true && item.push(next)
            return item
        }, [])
        return arr
    }
       console.log(unique(arr, 'id','age'))//当age属性为number类型时,会出现问题1+22===2+21
    /*[
     { id: 1, name: 'shy', age: 24 },
     { id: 2, name: 'orton', age: 20 },
     { id: 1, name: 'join', age: 22 },
     { id: 3, name: 'cena', age: 23 },
     { id: 2, name: 'belly', age: 21 },
 ]*/

方法二:filter()

       function unique2(arr, type,type2) {

       const obj = {};

       // 过滤的过程中完善 obj
       return arr.filter(t => {
           // 这里采用的办法是使用一个不会出现在两个数据中的字符 `|` 来连接
           const key = [t[type], t[type2]].join("|");

           // 检查如果对象中已经存在,那这个数据就过滤掉,不需要了
           if (obj[key]) {
               return false;
           }

           // 如果对象不存在,加入对象,同时把数据保留下来(返回 true)
           obj[key] = true;
           return true;
       });
   }
   console.log(unique2(arr, 'id','age'))
   /*
   [
           { id: 1, name: 'shy', age: 24 },
           { id: 2, name: 'orton', age: 20 },
           { id: 1, name: 'join', age: 22 },
           { id: 3, name: 'cena', age: 23 },
           { id: 2, name: 'belly', age: 21 },
       ]
   */

方法三:for...of+find()

   function unique3(arr, type, type2) {
       // 缓存用于记录
       const newArr = [];
       for (const t of arr) {
           // 检查缓存中是否已经存在
           if (newArr.find(c => c[type] === t[type] && c[type2] === t[type2])) {
               // 已经存在说明以前记录过,现在这个就是多余的,直接忽略
               continue;
           }
           // 不存在就说明以前没遇到过,把它记录下来
           newArr.push(t);
       }

       // 记录结果就是过滤后的结果
       return newArr;
   }
   console.log(unique3(arr, 'id', 'age'))
   /*
       [
               { id: 1, name: 'shy', age: 24 },
               { id: 2, name: 'orton', age: 20 },
               { id: 1, name: 'join', age: 22 },
               { id: 3, name: 'cena', age: 23 },
               { id: 2, name: 'belly', age: 21 },
           ]
       */

4.数组排序

方法一:sort()

   let arr = [8, 4, 1, 2, 4, 12, 4, 51, 24, -1, 0, 2, 4, 45, 21, 13]
   function compare(val1, val2) {
       return val1 - val2;
   };
   sort()方法会把比较的值转成字符串来比较,想要获得准确的排序,需要写一个排序方法
   console.log(arr.sort(compare))//[-1, 0, 1, 2, 2, 4, 4, 4, 4, 8, 12, 13, 21, 24, 45, 51]

方法二:冒泡排序

    function sort(arr) {
        for (var j = 0; j < arr.length - 1; j++) {
            //两两比较,如果前一个比后一个大,则交换位置。
            for (var i = 0; i < arr.length - 1 - j; i++) {
                if (arr[i] > arr[i + 1]) {
                    var temp = arr[i];
                    arr[i] = arr[i + 1];
                    arr[i + 1] = temp;
                }
            }
        }
        return arr
    }
    console.log(sort(arr));//[-1, 0, 1, 2, 2, 4, 4, 4, 4, 8, 12, 13, 21, 24, 45, 51]
        (1)比较相邻的元素。如果第一个比第二个大,就交换他们两个位置。
    (2)对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
    (3)针对所有的元素重复以上的步骤,除了最后一个。
    (4)持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

方法三:快速排序

        function quickSort(arr) {
            //如果数组长度小于等于1,则返回数组本身
            if (arr.length <= 1) {
                return arr;
            }
            //定义中间值的索引
            var index = Math.floor(arr.length / 2);
            //取到中间值
            var temp = arr.splice(index, 1);
            //定义左右部分数组
            var left = [];
            var right = [];
            for (var i = 0; i < arr.length; i++) {
                //如果元素比中间值小,那么放在左边,否则放右边
                if (arr[i] < temp) {
                    left.push(arr[i]);
                } else {
                    right.push(arr[i]);
                }
            }
            return quickSort(left).concat(temp, quickSort(right));
        }
        console.log(quickSort(arr));//  [-1, 0, 1, 2, 2, 4, 4, 4, 4, 8, 12, 13, 21, 24, 45, 51]
        Math.floor(x)方法是向下取整,返回小于或等于x的最接近的整数。
        splice(index, num, item)方法是向数组中添加项目,或是从数组中删除项目,并返回被删除的项目。
        (1)index是整数,被操作项目所在的位置(必须)
        (2)num是整数,要删除的项目的数量,如果为0,表示不删除(必须)
        (3)item是向数组中添加的新项目,可以是多个(可选)
        push()方法是向数组末尾添加一个或多个新项目并返回新数组的长度
        concat()方法连接两个或多个数组,不会改变原有数组,返回一个新数组

方法四:插入排序

        function insertSort(arr) {
            //假设第0元素是有序序列,第1元素之后是无序的序列。从第1元素开始依次将无序序列的元素插入到有序序列中
            for (var i = 1; i < arr.length; i++) {
                if (arr[i] < arr[i - 1]) {
                    //取出无序序列中需要插入的第i个元素
                    var temp = arr[i];
                    //定义有序中的最后一个位置
                    var j = i - 1;
                    arr[i] = arr[j];
                    //比较大小,找到插入的位置
                    while (j >= 0 && temp < arr[j]) {
                        arr[j + 1] = arr[j];
                        j--;
                    };
                    //插入
                    arr[j + 1] = temp;
                }
            }
            return arr
        }
        console.log(insertSort(arr));//  [-1, 0, 1, 2, 2, 4, 4, 4, 4, 8, 12, 13, 21, 24, 45, 51]
        (1)从第一个元素开始,该元素可以认为已经被排序
        (2)取出下一个元素,在已经排序的元素序列中扫描
        (3)如果该元素(已排序)大于新元素,将该元素移到下一位置
        (4)重复步骤3,直到找到已排序的元素小于或者等于新元素的位置
        (5)将新元素插入到下一位置中
        (6)重复步骤2

方法五:选择排序

   function selectSort(arr){
       for(var i=0;i<arr.length;i++){
           //设置当前范围最小值和索引
           var min = arr[i];
           var minIndex = i;
           //在该范围选出最小值
           for(var j=i+1;j<arr.length;j++){
               if(min>arr[j]){
                   min = arr[j];
                   minIndex = j;
               }
           }
           //将最小值插入,并将原来位置的最小值删除
           arr.splice(i,0,min);
           arr.splice(minIndex+1,1);
       }
       return arr
   }
   console.log(selectSort(arr)) //[-1, 0, 1, 2, 2, 4, 4, 4, 4, 8, 12, 13, 21, 24, 45, 51]
   (1)在未排序序列中找到最小(大)元素
   (2)并存放到排序序列的起始位置
   (3)然后,再从剩余未排序元素中继续寻找最小(大)元素
   (4)然后放到已排序序列的末尾。
   (5)以此类推

5.数组对象根据某个属性的值排序

    let arr = [
        { id: 1, name: 'shy', age: 24 },
        { id: 2, name: 'orton', age: 20 },
        { id: 1, name: 'join', age: 22 },
        { id: 3, name: 'cena', age: 23 },
        { id: 2, name: 'belly', age: 21 },
        { id: 1, name: 'randy', age: 24 },
    ]
    function compare(property, flag = true) {
        return function (a, b) {
            var value1 = a[property];
            var value2 = b[property];
            return flag ? value1 - value2 : value2 - value1;
        }
    }
    console.log(arr.sort(compare('age')))
    /*
     [
        { id: 2, name: 'orton', age: 20 },
        { id: 2, name: 'belly', age: 21 },
        { id: 1, name: 'join', age: 22 },
        { id: 3, name: 'cena', age: 23 },
        { id: 1, name: 'shy', age: 24 },
        { id: 1, name: 'randy', age: 24 },
    ]
    */

6.数组对象根据多个属性的值排序

    let arr = [
        { id: 1, name: 'shy', age: 24 },
        { id: 2, name: 'orton', age: 20 },
        { id: 1, name: 'join', age: 22 },
        { id: 3, name: 'cena', age: 23 },
        { id: 2, name: 'belly', age: 21 },
        { id: 1, name: 'randy', age: 24 },
    ]
    function compare(property, flag = true) {
        return function (a, b) {
            if (a[property[0]] === b[property[0]]) {
                return flag ? a[property[1]] - b[property[1]] : b[property[1]] - a[property[1]]
            } else {
                return flag ? a[property[0]] - b[property[0]] : b[property[0]] - a[property[0]]
            }

        }

    }
    console.log(arr.sort(compare(['id', 'age'])))
    /*
    [
       { id: 1, name: 'join', age: 22 },
       { id: 1, name: 'shy', age: 24 },
       { id: 1, name: 'randy', age: 24 },
       { id: 2, name: 'orton', age: 20 },
       { id: 2, name: 'belly', age: 21 },
       { id: 3, name: 'cena', age: 23 }, 
   ]
   */

7.数组合并

    let arr1 = [1, 2, 3]
    let arr2 = [4, 5, 6]

方法一:concat()

   console.log(arr1.concat(arr2)) //[1, 2, 3, 4, 5, 6]

方法二;结构赋值

    console.log([...arr1, ...arr2]) //[1, 2, 3, 4, 5, 6]

方法三:for循环

    function arrConcat(a, b) {
        for (let i in b) {
            a.push(b[i])
        }
        return a
    }
    console.log(arrConcat(arr1, arr2)) //[1, 2, 3, 4, 5, 6]

8.数组对象根据某一个属性的值相同进行合并

方法一:for循环判断新数组对象中该属性是否存在,存在合并

    let arr = [
        { id: 1, name: 'shy', age: 24 },
        { id: 2, name: 'orton', age: 20 },
        { id: 1, name: 'join', age: 22 },
        { id: 3, name: 'cena', age: 23 },
        { id: 2, name: 'belly', age: 21 },
        { id: 1, name: 'randy', age: 24 },
    ]
    function arrConcat(arr, type) {
        let tempArr = [],
            newArr = [];
        for (let i = 0; i < arr.length; i++) {
            if (tempArr.indexOf(arr[i][type]) === -1) {
                newArr.push({
                    id:arr[i][type],
                    name:[arr[i].name],
                    age:[arr[i].age]
                })
                tempArr.push(arr[i][type])
            } else {
                for (let j = 0; j < newArr.length; j++) {
                    if (newArr[j][type] == arr[i][type]) {
                        newArr[j].name.push(arr[i].name)
                        newArr[j].age.push(arr[i].age)
                    }
                }
            }

        }
        return newArr;
    }
    console.log(arrConcat(arr,'id'))
    /*
        [
            {
                "id": 1,
                "name": ["shy","join","randy"],
                "age": [24,22,24]
            },
            {
                "id": 2,
                "name": ["orton","belly"],
                "age": [20,21]
            },
            {
                "id": 3,
                "name": ["cena"],
                "age": [23]
            }
        ]
    */

方法二:reduce()+findIndex()

    function arrConcat(arr, type) {
        let newArray = [];
        newArray = arr.reduce((total, cur, index) => {
            let hasValue = total.findIndex(current => { return current[type] === cur[type] })
            console.log(hasValue, cur)
            if (hasValue === -1) {
                total.push({
                    id: cur[type],
                    name: [cur.name],
                    age: [cur.age]
                })
            } else {
                total[hasValue].name = total[hasValue].name.concat(cur.name)
                total[hasValue].age = total[hasValue].age.concat(cur.age)
            }

            return total
        }, [])
        return newArray
    }

    console.log(arrConcat(arr, 'id'))
    /*
       [
           {
               "id": 1,
               "name": ["shy","join","randy"],
               "age": [24,22,24]
           },
           {
               "id": 2,
               "name": ["orton","belly"],
               "age": [20,21]
           },
           {
               "id": 3,
               "name": ["cena"],
               "age": [23]
           }
       ]
       */

9.数组对象根据多个属性的值相同进行合并

    let arr = [
        { id: 1, name: 'shy', age: 24 },
        { id: 2, name: 'orton', age: 20 },
        { id: 1, name: 'join', age: 22 },
        { id: 3, name: 'cena', age: 23 },
        { id: 2, name: 'belly', age: 21 },
        { id: 1, name: 'randy', age: 24 },
    ]
    function arrConcat(arr, type) {
        let type0= type[0]
        let type1= type[1]
        let tempArr = [],
        tempArr2 = [],
            newArr = [];
        for (let i = 0; i < arr.length; i++) {
            if (tempArr.indexOf(arr[i][type0]) === -1 && tempArr2.indexOf(arr[i][type1]) === -1) {
                newArr.push({
                    id: arr[i][type0],
                    name: [arr[i].name],
                    age: arr[i][type1]
                })
                tempArr.push(arr[i][type0])
                tempArr2.push(arr[i][type1])
            } else {
                for (let j = 0; j < newArr.length; j++) {
                    if (newArr[j][type0] == arr[i][type0] && newArr[j][type1] == arr[i][type1]) {
                        newArr[j].name.push(arr[i].name)
                    }
                }
            }

        }
        return newArr;
    }
    console.log(arrConcat(arr, ['id', 'age']))
    /*
        [
            {
                "id": 1,
                "name": ["shy","randy"],
                "age": 24
            },
            {
                "id": 2,
                "name": ["orton"],
                "age": 20
            },
            {
                "id": 3,
                "name": ["cena"],
                "age": 23
            }
        ]
        */

10.数组中某个值出现的个数

    let arr = [8, 4, 1, 2, 4, 12, 4, 51, 24, -1, 0, 2, 4, 45, 21, 13]
    function arrNum(arr, key) {
        return arr.reduce((r, a) => a === key ? r + 1 : r + 0, 0)
    }
    console.log(arrNum(arr, 2)) //2

11.数组中每个值出现的个数

方法一:for循环

    let arr = [8, 4, 1, 2, 4, 12, 4, 51, 24, -1, 0, 2, 4, 45, 21, 13]
    function getArrNum(arr){
        let obj = {}
        for(let i = 0;i<arr.length;i++){
            obj[arr[i]]=(obj[arr[i]]+1)||1
        }
        return obj
    }
    console.log(getArrNum(arr)) //{0: 1, 1: 1, 2: 2, 4: 4, 8: 1, 12: 1, 13: 1, 21: 1, 24: 1, 45: 1, 51: 1, -1: 1}

方法二:reduce()

   function getArrNum(arr) {
       return arr.reduce((r, a) => {
           r[a] = (r[a] + 1) || 1
           return r
       }, {})
   }
   console.log(getArrNum(arr))//{0: 1, 1: 1, 2: 2, 4: 4, 8: 1, 12: 1, 13: 1, 21: 1, 24: 1, 45: 1, 51: 1, -1: 1}

12.数组中某个值出现的次数最多

方法一:for循环+for..in

    let arr = [8, 4, 1, 2, 4, 12, 4, 51, 24, -1, 0, 2, 4, 45, 21, 13]
    function getArrMost(arr) {
        let obj = {},
            mostVal = '';
        for (let i = 0; i < arr.length; i++) {
            obj[arr[i]] = (obj[arr[i]] + 1) || 1
        }
        // return obj
        for (var key in obj) { // 从对象中得到数组中出现最多的元素
            if (!mostVal) {
                mostVal = key;
            } else if (obj[mostVal] < obj[key]) {
                mostVal = key;
            }
        }
        return mostVal
    }
    console.log(getArrMost(arr)) // 4

方法二:reduce()+for..in

   function getArrMost(arr) {
       let mostVal = ''
       let obj = arr.reduce((r, a) => {
           r[a] = (r[a] + 1) || 1
           return r
       }, {})
               for (var key in obj) { // 从对象中得到数组中出现最多的元素
           if (!mostVal) {
               mostVal = key;
           } else if (obj[mostVal] < obj[key]) {
               mostVal = key;
           }
       }
       return mostVal
   }
   console.log(getArrMost(arr)); //4

13.同一个数组对象中判断某一个属性的值是否相同

    let arr = [
        { id: 1, name: 'shy', age: 24 },
        { id: 2, name: 'orton', age: 20 },
        { id: 1, name: 'join', age: 22 },
        { id: 3, name: 'cena', age: 23 },
        { id: 2, name: 'belly', age: 21 },
        { id: 1, name: 'randy', age: 24 },
    ]
    function isAllEqual(arr, type) {//该属性是否全部相同
        return arr.every(params => arr.filter(item => item[type] === params[type]).length === arr.length)
    }
    console.log(isAllEqual(arr, 'id'))//false
    function isEqual(arr, type) {//该属性是否有相同
        return arr.some(params => arr.filter(item => item[type] === params[type]).length > 1)
    }
    console.log(isEqual(arr, 'id'))//true

14.同一个数组对象中判断多个属性的值是否相同

   let arr = [
        { id: 1, name: 'shy', age: 24 },
        { id: 2, name: 'orton', age: 20 },
        { id: 1, name: 'join', age: 22 },
        { id: 3, name: 'cena', age: 23 },
        { id: 2, name: 'belly', age: 21 },
        { id: 1, name: 'randy', age: 24 },
    ]
   function isAllEqual(arr, type) {//该属性是否全部相同
        return arr.every(params => arr.filter(item => item[type[0]] === params[type[0]]).length === arr.length && arr.filter(item => item[type[1]] === params[type[1]]).length === arr.length)
    }
    console.log(isAllEqual(arr, ['id', 'age']))//false
    function isEqual(arr, type) {//该属性是否有相同
        return arr.some(params => arr.filter(item => item[type[0]] === params[type[0]]).length > 1 && arr.filter(item => item[type[1]] === params[type[1]]).length > 1)
    }
    console.log(isEqual(arr, ['id', 'age']))//true