数组与对象数组操作整理,方便工作快速提取(持续更新)

1、获取数组最大值

let maxval = Math.max(...[1,2,34])
let maxval2 = Math.max.apply(null,[1,2,34])
console.log(maxval )//34
console.log(maxval2 )//34

更习惯第一种写法,解构后直接使用Math

2、获取对象数组中长度最长的属性值

let arr = [{name:'测试测试测试测试测试测试',age:10},{name:'测试测试',age:11}];
let maxl = Math.max(...arr.map(item=>item.name.length));
let maxl2 =Math.max.apply(null,arr.map(item=>item.name.length))
console.log(maxl )//12
console.log(maxl2 )//12

以前工作时碰到elementui列的宽度自适应,思路就是获取数组值的最大长度,方便定义width

3、数组或对象数组去重

let tarr = [1,1,2,2,3];
console.log([...new Set(tarr)])//[1,2,3]

第二种

let tmpa = [1,1,2,3,3];
console.log(Array.from(new Set(tmpa)))//[1,2,3]

第三种:对象某个属性值相同去重

var arr=[{id:1,name:'a'},{id:2,name:'b'},{id:1,name:'c'}]
let obj = {};
var newArr = arr.reduce((cur,next)=>{
   obj[next.id] ? "" : obj[next.id] = true  && cur.push(next);
   return cur
},[])
console.log(newArr)//[{id:1,name:'a'},{id:2,name:'b'}]

4、数组或对象数组某个相同属性值求和

var arr = [1,2,3,4,5]
var sum = arr.reduce((sum,num)=>{
   return sum + num 
},10)//起始值为10,依次遍历相加
console.log(sum)//25


let arr = [{id:1,num:3},{id:2,num:1},{id:1,num:4}];
      let newArr = arr.reduce((arr,item,index)=>{
        if(arr.findIndex(it=>it.id == item.id) !=-1){
          arr[arr.findIndex(it=>it.id == item.id)].num +=item.num;
          return arr;
        }else{
         return arr.concat(item)
      },[]);
      console.log(newArr)//[{id:1,num:7},{id:3,num:1}];

5、二维或多维数组转一维数组

let arr = [[0, 1], [2, 3], [4, 5]]
let newArr = arr.reduce((pre,cur)=>{
    return pre.concat(cur)
},[])
console.log(newArr); // [0, 1, 2, 3, 4, 5]


let arr = [[0, 1], [2, 3], [4,[5,6,7]]]
const newArr = function(arr){
   return arr.reduce((pre,cur)=>pre.concat(Array.isArray(cur)?newArr(cur):cur),[])
console.log(newArr(arr)); //[0, 1, 2, 3, 4, 5, 6, 7]

6、工作中遇到的根据对象数组转换成表格的动态列

需求:将以下返回的数据结构转成一维数组,并实现部分动态列,dayList数组里面有几条数据就是几个动态列

      let data=[
          id: 99,
          mealTimes: 1,
          ratio: null,
          time: "09:00",
          dayList:[
            {endDay: 2,id: 169,isAccumulative: true,ratio: 70,startDay: 1},
            {endDay: 2,id: 170,isAccumulative: false,ratio: 20,startDay: 2}
          id: 100,
          mealTimes: 1,
          ratio: null,
          time: "10:00",
          dayList:[
            {endDay: 2,id: 171,isAccumulative: true,ratio: 30,startDay: 1},
            {endDay: 2,id: 172,isAccumulative: false,ratio: 80,startDay: 2}
//根据以上数据需生成固定列mealTimes、ratio、time以及两条动态列f1,f2
//f1来源与dayList中的startDay的值'f'+1,f2来源与dayList中的startDay的值'f'+2
let keydata = [];
      let tablePlanLabel = [
        { label: '餐次', param: 'mealTimes',isIndex:true,width:80},
        { label: '时间|产仔天数', param: 'time',isTime:true,minWidth:120,width:120}
      //获取key值
      data[0].dayList.map(item=>{
        let dtlabel = 'f'+item.startDay;
        keydata.push(dtlabel)
        tablePlanLabel.push({
          label:'第'+item.startDay+'天', param:''+[dtlabel]+'',isFeedRate:true,minWidth:110
      //动态改变tablePlanLabel
      let  gestationfeedplan0=[];
      if(data[0].dayList.length>0){
        //构建第一行数据
        let objfirst = {mealTimes:0,time:0,ratio:0};
        let objfirstOther = data[0].dayList.reduce((obj,item,index)=>{
          let dtlabel = 'f'+item.startDay;
          Object.assign(obj,{[dtlabel]:item.isAccumulative?1:0});
          return obj
        },{})
        gestationfeedplan0.push(Object.assign(objfirst,objfirstOther))
        //构建第二行及以上数据
        data.map(it=>{
          let obj1 = {mealTimes:it.mealTimes,time:it.time,ratio:it.ratio};
          let obj2 =keydata.reduce((obj,item,index)=>{
            Object.assign(obj,{[item]:it.dayList[index].ratio})
            return obj
          },{})
          gestationfeedplan0.push(Object.assign(obj1,obj2))
//返回的结果集1:gestationfeedplan0
[{f1: 1,f2: 0,mealTimes: 0,ratio: 0,time: 0},
 {f1: 70,f2: 20,mealTimes: 1,ratio: null,time: "9:00"},
 {f1: 30,f2: 80,mealTimes: 2,ratio: null,time: "11:00"}]
//返回的结果集2:gestationfeedplan0