前端js数组对象特定要求合并

这是一个数组对象合并的案例:

 需要被处理的数组对象:

var arr = [{
            "sss": "lisi",
            "list": "",
            "value": "value"
        },
        {
            "sss": "lisi",
            "list": "list",
            "value": ""
        }, {
            "sss": "kk",
            "list": "",
            "value": "2"
        },
        {
            "sss": "kk",
            "list": "2",
            "value": ""
        }
    ];

需要被处理成:

      看到之后想到的第一想法是:...扩展运算符 set  但是不是这么简单的 因为这俩方法会覆盖前面的是不符合这个案例的  可以先想一想有什么别的方法然后再看下面的解决方法

方法一:

 function deepCloneArr(arr, name) {
        let deepArr = []
        let deepObj = {}
        let deepItem
        arr.forEach((item, index) => {
            arr.forEach(((r, i) => {
                if (deepItem != item) {
                    if (item[name] == r[name] && item != r) {
                        deepItem = r
                        for (let key in item) {
                            if (item[key] == '' && key != undefined) {
                                deepObj[key] = r[key]
                            } else if (item[key] != '' && key != undefined) {
                                deepObj[key] = item[key]
                            }
                        }
                        let deepClone = Object.assign({}, deepObj)
                        deepArr.push(deepClone)
                    }
                }
            }))
        })
        return deepArr
    }

    console.log(deepCloneArr(arr, 'sss'));

方法二:

 let newarr = [],
        rqarr = [],
        newobj = {}
    arr.forEach((r, index) => {
        newobj = Object.keys(r).filter((key) => r[key] !== "" && r[key] !== null && r[key] !== undefined)
            .reduce((acc, key) => ({
                ...acc,
                [key]: r[key]
            }), {})
        rqarr.push(newobj)
    })
    rqarr.forEach((v, ii) => {
        let res = rqarr.find((b, i) => b.sss == v.sss && ii < i)
        if (res) {
            let command = {
                ...v,
                ...res
            }
            newarr.push(command)
        }
    })
    console.log(newarr);

方法三:

 // 非空字段
    var res = [];
    var narr = [];
    for (let i = 0; i < arr.length; i++) {
        const flag = res.indexOf(arr[i].sss);
        if (flag == -1) {
            res.push(arr[i].sss);
            narr.push({
                sss: arr[i].sss,
                list: arr[i].list,
                value: arr[i].value,
            });
        } else {
            for (let k in narr[flag]) {
                narr[flag][k] ? narr[flag][k] : (narr[flag][k] = arr[i][k]);
            }
        }
    }
    console.log(narr);

还可以了解一下其中用到的方法:

 Object.keys() 

filter()

reduce()

push()

forEach()

find()

...扩展运算符 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值