加载中...

数组对象去重

博客 2023.04.08 19:55 678

问题描述: 有两个对象数组,检查一个对象数组是否包含另一个对象数组中的元素;

解决思路: 采用ES6新增的Set集合,可以采用ES6新增的Array.from辅助;

知识点:

  1. Set是一种新的集合类型,new Set创建了空集合,Set有一个特性是不会添加重复的值,Set的has方法是判断Set实例是否含有某个元素且返回布尔值;
  2. Array.from将一个类数组对象或者可遍历的对象转换成一个真正的数组;
  3. 类数组对象最基本的是具有length属性,要转换成一个真正的数组就还需要包括:这个类数组对象的属性名必须为数字型或者字符串型的数字;

代码示例:

 /**
   * 判断两个证据列表是否有重复
   * 证据列表去重
   * @return {*}
   */
  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));