业务上会用到数组处理(持续更新)

743 阅读3分钟

这是我参与更文挑战的第2天,活动详情查看: 更文挑战

为了方便测试代码,都写成了可在控制台输出的函数😀

找出两个数组中id不相同/相同的对象

let arr1 = [{ id: 1 }, { id: 2 }, { id: 3 }, { id: 4 }, { id: 5 }]
let arr2 = [{ id: 1 }, { id: 2 }, { id: 3 }]
let arr3 = arr1.filter(item => {
	let idList= arr2.map(v => v.id)
  return !idList.includes(item.id)
 })
console.log(arr3)

合并数组相同对象,属性值相加

var a = [
  {id:1,num:"12"},
  {id:2,num:"13"},
  {id:3,num:"3"},
  {id:2,num:"16"},
  {id:5,num:"14"},
  {id:1,num:"14"}
]
var b = []
for(var i = 0; i < a.length;i++){
    for(var j = a.length-1;j>i;j--){
        if(a[i].id == a[j].id){
            a[i].num = (a[i].num*1 + a[j].num*1).toString()
            b.push(j)
        }
    }

}
for(var k = 0; k<b.length;k++){
    a.splice(b[k],1)
}
console.log(a)

计算数组中某个元素重复出现的个数

let list = ["李","李","设","弟","弟","生","生","李"];
let counts = list.reduce((a, v) => v === "李" ? a + 1 : a + 0, 0);
console.log(counts);//3

计算数组中每个元素重复出现的个数

var arr = ["李","李","设","弟","弟","生","生","李"]; 

function getRepeatNum1(){ 
    var obj = {}; 
    for(var i= 0, l = arr.length; i< l; i++){ 
        var item = arr[i]; 
        obj[item] = (obj[item] +1 ) || 1; 
    } 
    return obj; 
}
function getRepeatNum2(){ 
    return arr.reduce(function(prev,next){ 
        prev[next] = (prev[next] + 1) || 1; 
        return prev; 
    },{}); 
} 
console.log(getRepeatNum1());//{李: 3, 设: 1, 弟: 2, 生: 2}
console.log(getRepeatNum2());//{李: 3, 设: 1, 弟: 2, 生: 2}

数组找出不同的元素

let sameArr = (arrOne,arrTwo) => arrOne.filter(item => arrTwo.findIndex(subItem => subItem.id == item.id) === -1)
sameArr([{id:12},{id:13}],[{id:20},{id:13}])//[{id:12}]

数组里时间排序

let arr = [{Date:'2020-10-21'},{Date:'2020-10-20'},{Date:'2020-10-22'}]
arr.sort((a, b) => new Date(b.Date.replace(/-/g, '/')).getTime() - new Date(a.Date.replace(/-/g, '/')).getTime())
console.log(arr)

筛选数组对象中的属性

let arr =[
{
  "id": "b3bae8fcde0d4a50b7fbcbbccf4fe216",
  "sex": 2,
  "userAccount": "chenghua",
  "userName": "lomo"
  }
];
let afterArr = arr.map(item=>{
	let obj ={
      "sex": '',
      "userAccount": "",
      "userName": ""
	}
  Object.keys(obj).forEach(key=>{obj[key]=item[key]})
	return obj
})
//或
let afterArr = arr.map(item=>{
	return {
      sex: item.sex,
      userAccount: item.userAccount,
      userName: item.userName
	}
})
console.log(afterArr)

两个数组对象有相同的某个属性值,补全另一个数组对象属性值

let a = [
    {
        'name': 'wang',
        'age': '18',
        'six': '1'
    }
];
let b = [
    {
        'name': 'wang',
        'age': '8',
        'six': ''
    }
];
for (let i = a.length; i--;) {
    for (let j = b.length; j--;) {
        if (a[i].name === b[j].name) {
            b[j].six = a[i].six;
            break; // 条件满足跳出循环
        }
    }
}
console.log(b);//[{name: 'wang', age: '8', six: '1'}]

树形数组递归拿到子项数据

//数据
let data1=  [
    {
        title: 'parent 1',
        expand: true,
        children: [
            {
                title: 'parent 1-1',
                expand: true,
                tag:true,
                children: [
                    {
                        title: 'leaf 1-1-1'
                    },
                    {
                        title: 'leaf 1-1-2'
                    }
                ]
            },
            {
                title: 'parent 1-2',
                expand: true,
                tag:true,
                children: [
                    {
                        title: 'leaf 1-2-1'
                    },
                    {
                        title: 'leaf 1-2-1'
                    }
                ]
            }
        ]
    }
]
function getInnerMenuList(menuTreeList, menuList) {
      for (let item of menuTreeList) {
        /*判断是否符合递归条件(这里不是一定要最递归到最里面的层级,想得到某一层级
        的数据,递归条件就判断这一层级的特有属性即可,例如本例想得到1-1这一层级,
        !item.tag 就可以是递归条件)*/
        item.children?getInnerMenuList(item.children, menuList):menuList.push(item)
      }
};
    let arr = [];
    getInnerMenuList(data1,arr);
    console.log(arr);
    //0: {title: "leaf 1-1-1"}
    //1: {title: "leaf 1-1-2"}
    //2: {title: "leaf 1-2-1"}
    //3: {title: "leaf 1-2-1"}

根据条件数组筛选另一数组

//条件数组
let ageList = [12,16]; 
//被筛选的数组
let objList = [
        {name:'tom',age:12},
        {name:'jack',age:33},
        {name:'zio',age:12},
        {name:'lolo',age:89},
        {name:'robin',age:16},
        ]

//1
let data = objList.filter((item/)=> ageList.includes(item.age));
console.log(data)

//2
let map = {};
let ret = [];
objList.forEach(item => (map[item.age] = map[item.age]||[]).push(item));
ageList.forEach(item => map[item] && [].push.apply(ret, map[item]));
console.log(ret);

数组对象里的属性求和

var result = [
    {
        subject: 'math',
        score: 10
    },
    {
        subject: 'chinese',
        score: 20
    },
    {
        subject: 'english',
        score: 30
    }
];
let sum = result.reduce((prev, cur)=> cur.score + prev, 0);
console.log(sum) //60

版本号比较

//1 "2.2.3"、"v2.2.3"适用 不适用"2.3.0a"
function compareVersion(a,b){
    function toNum(a){
      var a=a.toString();
      var c=a.split(/\D/);
      var num_place=["","0","00","000","0000"],r=num_place.reverse();
      for (var i=0;i<c.length;i++){
        var len=c[i].length;
                 c[i]=r[len]+c[i];
       }
      var res= c.join('');
      return res;
     } 
   var _a=toNum(a),_b=toNum(b);
   if(_a==_b) return '相等'
   if(_a>_b)  return '大于'
   if(_a<_b)  return '小于'
}
compareVersion("2.2.3","2.3.0");
compareVersion("v2.2.3","v2.3.0");

//2   "2.2.3"、"v2.2.3"、"2.3.0a"都适用
function cpr_version(a,b){
    Array.prototype.triming=function(){
       var  arr=[];
       this.forEach(function(e){
           if(e.match(/\S+/))  arr.push(e);
       })
       return arr;
    }
    //提取数字部分
    function toNum(a){
        var a=a.toString();
        var c=a.split(/\D/).triming();
        var num_place=["","0","00","000","0000"],r=num_place.reverse();
        for (var i=0;i<c.length;i++){
            var len=c[i].length;
            c[i]=r[len]+c[i];
        }
        var res= c.join('');
        return res;
    } 
    //提取字符
    function toChar(a){
      var a=a.toString();
      var c=a.split(/\.|\d/).join('');
      return c;
    }
    let _a1=toNum(a),_a2= toChar(a), _b1=toNum(b),_b2= toChar(b);
    if(_a1>_b1)  console.log("版本号"+a+"是新版本!");  
    if(_a1<_b1)  console.log("版本号"+b+"是新版本!"); 
    if(_a1===_b1)  {
        _a2=_a2.charCodeAt(0).toString(16);
        _b2=_b2.charCodeAt(0).toString(16);
        if (_a2>_b2)  console.log("版本号"+a+"是新版本!");   
        if(_a2<_b2)   console.log("版本号"+b+"是新版本!"); 
        if(_a2===_b2) console.log("版本号相同!版本号为:"+a);
     }
    }
    cpr_version("2.3.0a","2.3.0b");
    cpr_version("2.3.0c","2.3.0c");