这是一个数组对象合并的案例:
需要被处理的数组对象:
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()
...扩展运算符