js处理数组的一些小技巧

397 阅读1分钟

1.some 和 every的区别

const list = [

  {name:'张三',back:"false"},

  {name:'李四',back:"true"},

  {name:'王五',back:"false"},

]

const a = list.some(item=>item.back)

console.log(a);//true

const b = list.every(item=>!item.back)

console.log(b);//false

二者是用来做数组条件判断的,都会返回一个布尔值

some:   有一个元素满足条件返回true, 循环中断,所有元素不满足条件返回false;

every:   刚好与some相反,有一元素满足条件返回false,循环中断,所有元素满足条件返回true;

2.去重

let a = [1,1,3,4,5,3,5,3,5]

const b =[...new Set(a)]

console.log(b);//[ 1, 3, 4, 5 ]

3.数组对象去重

var arr = [{name: 'a',id: 1}, {name: 'a',id: 2}, {name: 'b',id: 3}, {name: 'c',id: 4},

 {name: 'c',id: 6}, {name: 'b',id: 6}, {name: 'd',id: 7}];

  var temp=[];  方法2引用

var obj={};  //方法3引用

function removal() {

   方法1: es5冒泡排序法,去重arr   

     for (var i = 0; i < arr.length - 1; i++) {

        for (var j = i + 1; j < arr.length; j++) {

           if (arr[i].name == arr[j].name) {

                 arr.splice(j, 1);

                 //因为数组长度减小1,所以直接 j++ 会漏掉一个元素,所以要 j--

              j--;

             }

        }

     }

     return arr;

  方法2:es5新建数据双重循环,去重arr2

      arr.forEach(item1 => {

      const check= temp.every((item2)=>{

         return item1.name !== item2.name;

      })

      check?temp.push(item1):''

    });

    return temp;

  方法3:es5 对象法去重arr

   arr = arr.reduce((a,b)=>{

   obj[b.name]?'':obj[b.name] = true && a.push(b);

    return a;

   },[])

   return arr;

}

var newArr = removal();

console.log(newArr);//[ { name: 'a', id: 1 },{ name: 'b', id: 3 },{ name: 'c', id: 4 }, { name: 'd', id: 7 }]

4.数组分割

function Chunk(arr = [], size = 1) {

  return arr.length ? arr.reduce((t, v) => (t[t.length - 1].length === size ? t.push([v]) : t[t.length - 1].push(v), t), [[]]) : [];

}

const arr = [1, 2, 3, 4, 5];

console.log(Chunk(arr, 2)) // [[1, 2], [3, 4], [5]]

5.求数组最大值或最小值

function Max(arr = []) {

  return arr.reduce((t, v) => t > v ? t : v);

}

function Min(arr = []) {

  return arr.reduce((t, v) => t < v ? t : v);

}

const arr = [1,4,5,76,47,88,545,54,5654];

console.log(Max(arr)); // 5654

console.log(Min(arr)); // 1

6.展开多维数组

flat()默认只会“拉平”一层,如果想要“拉平”多层的嵌套数组,可以将flat()方法的参数写成一个整数,表示想要拉平的层数,默认为1

如果不管有多少层嵌套,都要转成一维数组,可以用Infinity关键字作为参数

let arr=[1,2,3,[4,5,6],8];

let result = arr.flat()

console.log(result);//[1,2,3,4,5,6,8]

let arr=[1,2,3,[4,5,[10],[12,[3]],6],8];

let result = arr.flat(Infinity)

console.log(result);// [1,  2, 3, 4, 5,10, 12, 3, 6, 8]

flatMap() 方法跟flat的区别是多一个回调函数,可以用来做一些事,但是只能处理深度为1层的数组

let arr=[[1,2],[3,4],[5,6]]

let arr2 = arr.flatMap(item=>{

  item = item.filter(item=>item>=2)

  return item

})

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