问题描述: 有两个对象数组,检查一个对象数组是否包含另一个对象数组中的元素;
解决思路: 采用ES6新增的Set集合,可以采用ES6新增的Array.from辅助;
知识点:
- Set是一种新的集合类型,new Set创建了空集合,Set有一个特性是不会添加重复的值,Set的has方法是判断Set实例是否含有某个元素且返回布尔值;
- Array.from将一个类数组对象或者可遍历的对象转换成一个真正的数组;
- 类数组对象最基本的是具有length属性,要转换成一个真正的数组就还需要包括:这个类数组对象的属性名必须为数字型或者字符串型的数字;
代码示例:
setEvidenceList(list: EvidenceItem[]) {
let newList1 = new Set(JSON.stringify(list));
let newList2 = new Set(JSON.stringify(this.evidenceList));
let intersectionSet = new Set([...newList1].filter((x) => newList2.has(x)));
let resArr = Array.from(intersectionSet);
if (resArr.length > 0) {
uni.showModal({
title: "文件重复",
content: "是否覆盖相同文件?",
success: (res) => {
if (res.confirm) {
this.evidenceList = [...this.evidenceList, ...list];
const res = new Map();
this.evidenceList = this.evidenceList.filter(
(x) => !res.has(x.guid) && res.set(x.guid, 1)
);
}
},
});
}
}
也可以使用简洁代码的方法(可以是多个对象数组):
let arr = this.evidenceList.concat(list);
this.evidenceList = [
...new Set(arr.map((t) => JSON.stringify(t))),
].map((s) => JSON.parse(s));