数组与对象数组操作整理,方便工作快速提取(持续更新)
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