zoukankan      html  css  js  c++  java
  • 如何根据key合并数组中的对象

    原文地址

    如何根据key合并数组中的对象(已同步到npm lm-public-js 中)

    项目中经常会遇到,array内包含object这个格式的json 需要我们根据一个key去合并其中的对象,一般是 id
    效率最低的方法是 循环套循环,找到一致id的,然后添加到其中一个array内
    比较好的方法 是把这个id对应的object 暂存一个obj内,比如 obj[item.id] = {...item,...item2}
    最后根据 Object.values() 方法 重新转化为数组

        function mergeArrAndObj(data1 = [],data2 = [],key){
            if(!(data1 instanceof Array || data1 instanceof Object)) return console.warn('第一个参数格式不对')
            if(!(data2 instanceof Array || data2 instanceof Object)) return console.warn('第二个参数格式不对')
            if(!((data1 instanceof Array && data2 instanceof Array) || (data1 instanceof Object && data2 instanceof Object))) return console.warn('数据类型不一致')
            
            //都为数组的情况
            if( data1 instanceof Array){
                if(typeof key !== 'string') return console.warn('第三个参数 key 应为字符串')
                if(!key.length) return console.warn('第三个参数 key 长度不应为空')
                if(typeof key === 'undefined') return console.warn('请传入第三个参数 key')
    
                //找出最长的数组
                let maxArr = data1.length > data2.length ? data1:data2
                //找出最长的数组
                let minArr = data1.length < data2.length ? data1:data2
                //临时存放数据的数组
                let sumArr = []
                //临时存放数据的对象 
                let obj = {}
    
                maxArr.forEach((item,index)=>{
                    //此时短的那一个数组已经循环完了
                    if(minArr[index] === undefined){
                        //只需要处理较长的那个数组
                        return obj[item[key]] = {...maxArr[index]}
                    }
    
                    //这里是短的那一个数组还没循环完的情况
                    obj[item[key]] = {...maxArr[index],...minArr[index]}
                })
                sumArr = Object.values(obj)
    
                return sumArr
                
            }else{
                //都为对象
                //此处为浅合并 key一致会被替换
                return {...data1,...data2}
            }
            
        }
    
    

    简单测试一下

        mergeArrAndObj([{id:2,c:2}],[{id:2,a:2},{id:3,a:3}],'id')
    
        [
            {id:2,c:2,a:2},
            {id:3,a:3}
        ]
    
  • 相关阅读:
    JS随笔
    tp5 redis 单例模式 转载
    分享我编程工作经历及对软件开发前景的看法
    redis详解(一)-- 概述
    redis详解(二)-- 数据类型详解
    redis详解(四)-- 高可用分布式集群
    redis详解(三)
    新工科平台
    关于Nginx的负载均衡
    微信退款回调
  • 原文地址:https://www.cnblogs.com/big0range/p/14204917.html
Copyright © 2011-2022 走看看