数组技巧

182 阅读2分钟

嵌套数组的合并,扁平化数组

1.reduce+concat

let arr = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
arr= arr.reduce((a,b)=> a.concat(b))

2.toString+split+map

let arr = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
arr = arr.toString().split(',').map(r=>+r)

数组去重

1.filter + indexOf

let arr = [1, 'a', 'a', 'b', 'd', 'e', 'e', 1, 0, 2, 2, 3];
arr = arr.filter((item, i, arry) => {return arry.indexOf(item) === i })

2.filter + Map

let arr = [1, 'a', 'a', 'b', 'd', 'e', 'e', 1, 0, 2, 2, 3];
let map = new Map()
arr = arr.filter(item=>{return !map.has(item)&&map.set(item,1)})

3.for...of + indexOf + 新数组

let arr = [1, 'a', 'a', 'b', 'd', 'e', 'e', 1, 0, 2, 2, 3];
let newArr = []
for (const item of arr) {
    if(newArr.indexOf(item)==-1){
        newArr.push(item)
    }
}

4.展开运算符+new Set,new Set()将传入的数组转化为对象,用展开运算符将对象转化转为用逗号分隔的参数序列

let arr = [1, 'a', 'a', 'b', 'd', 'e', 'e', 1, 0, 2, 2, 3];
console.log( [...new Set(arr)])

reduce

封装

Array.prototype.reducee=function (callback,ini=0){
  numOne.forEach((item,i,array)=>ini=callback(ini,item))
  return ini
}
console.log(numOne.reducee(function(t,item){
  return ...
},initValue))

代替map和filter

因为map和filter返回的是数组,所以要实现map的功能,初始值是[]

var numTwo = [1, 2, 3, 4, 5, 6];
var arr = numTwo.reduce((t,item)=>[...t,item],[])//[1, 2, 3, 4, 5, 6]
var arr1= numTwo.reduce((t,item)=>item>3?[...t,item]:[...t],[])//[4, 5, 6]

求数组最大值最小值

//最大值
numOne.reduce((t,item)=>t>item?t:item)
//最小值
numOne.reduce((t,item)=>t<item?t:item)

Array.from映射数组

Array.from可以接受第二个参数,作用类似于数组的map方法,用来对每个元素进行处理,将处理后的值放入返回的数组。

var friends = [
    { name: "John", age: 22 },
    { name: "Peter", age: 23 },
    { name: "Mark", age: 24 },
    { name: "Maria", age: 22 },
    { name: "Monica", age: 21 },
    { name: "Martha", age: 19 },
  ]
  let arr = Array.from(friends,item=>item.name)
  //或者解构let arr = Array.from(friends,({name})=>name)
  console.log(arr)//["John", "Peter", "Mark", "Maria", "Monica", "Martha"]

用spread运算符(...)将数组转对象

var fruits = ["banana", "apple", "orange", "watermelon"];
var fruitsObj = { ...fruits };
console.log(fruitsObj);//{0: "banana", 1: "apple", 2: "orange", 3: "watermelon"}

空数组

将数组的长度设为0

数据填充数组

var newArray = new Array(10).fill("1");
console.log(newArray);
// returns ["1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1"]

合并数组

var fruits = ["apple", "banana", "orange"];
var meat = ["poultry", "beef", "fish"];
var vegetables = ["potato", "tomato", "cucumber"];
var food = […fruits, …meat, …vegetables];

求两个数组的交集(filter+includes)

var numOne = [0, 2, 4, 6, 8, 8];
var numTwo = [1, 2, 3, 4, 5, 6];
var duplicatedValues = […new Set(numOne)].filter(item => numTwo.includes(item));

数组中删除假值(Boolean+filter)

var mixedArr = [0, "blue", "", NaN, 9, true, undefined, "white", false];
var trueArr = mixedArr.filter(Boolean);
console.log(trueArr);