Xin's blog Xin's blog
首页
  • 前端文章

    • HTML
    • CSS
    • JavaScript
    • Vue
    • 组件与插件
    • CSS扩展语言
  • 学习笔记

    • 《JavaScript教程》笔记
    • 《JavaScript高级程序设计》笔记
    • 《ES6 教程》笔记
    • 《Vue》笔记
    • 《TypeScript 从零实现 axios》
    • 《Git》学习笔记
    • TypeScript笔记
    • JS设计模式总结笔记
  • 前端框架面试题汇总
  • 基本面试题
  • 进阶面试题
  • 其它
  • 技术文档
  • GitHub技巧
  • Nodejs
  • 博客搭建
  • 前后端联调
  • mock.js
  • 奇技淫巧
  • 分类
  • 标签
  • 归档
关于
GitHub (opens new window)

Xin

英雄可不能临阵脱逃啊~
首页
  • 前端文章

    • HTML
    • CSS
    • JavaScript
    • Vue
    • 组件与插件
    • CSS扩展语言
  • 学习笔记

    • 《JavaScript教程》笔记
    • 《JavaScript高级程序设计》笔记
    • 《ES6 教程》笔记
    • 《Vue》笔记
    • 《TypeScript 从零实现 axios》
    • 《Git》学习笔记
    • TypeScript笔记
    • JS设计模式总结笔记
  • 前端框架面试题汇总
  • 基本面试题
  • 进阶面试题
  • 其它
  • 技术文档
  • GitHub技巧
  • Nodejs
  • 博客搭建
  • 前后端联调
  • mock.js
  • 奇技淫巧
  • 分类
  • 标签
  • 归档
关于
GitHub (opens new window)
  • HTML

  • CSS

  • JavaScript

    • 知识点

    • 方法

      • js能力提升1
      • js能力提升2
      • JS随机打乱数组
      • 判断是否为移动端浏览器
      • 将一维数组按指定长度转为二维数组
      • 防抖与节流函数
      • JS获取和修改url参数
      • js常用方法
      • js数据类型及类型判断
      • 用最简洁的代码去实现indexOf
      • 清空数组的方法
      • filter()方法过滤时如何保留假值?
      • 监听img元素是否加载完成
      • 树形结构转一维数组
      • 过滤数两个数组中重复的元素
        • 普通元素
        • 对象元素
          • reduce()+new Map()的方式
          • 数组循环的方式
          • 优化版
      • 因为数据类型导致的排序错乱问题
  • Vue

  • 组件与插件

  • css扩展语言

  • 学习笔记

  • 前端
  • JavaScript
  • 方法
ctrlwin
2022-02-10

过滤数两个数组中重复的元素

# 过滤两个数组中重复的元素

# 普通元素

var a = [1, 2, 3, 4, 5],
b = [ 1, 2, 3];
a.filter(i => b.indexOf(i) !== -1); // [4, 5]
1
2
3

# 对象元素

# reduce()+new Map()的方式

这里要注意一点,两个数组中的对象必须完全一样才可以检测

let arr1 = [{ id: 1 }, { id: 2 }, { id: 3 }, { id: 4 }, { id: 5 }];
let arr2 = [{ id: 1 }, { id: 2 }, { id: 3 }];
let res = Object.assing(arr1); // 输出数组
const all = [...arr1, ...arr2].reduce((all, n) => {
    n = JSON.stringify(n);
    all.set(n, (all.get(n) || 0) + 1); // 标记重复的元素的数量
    return all;
}, new Map());

// 找交集
for (const dataset of all) {
    const [key, num] = dataset;
    if (num > 1) { // num大于1代表该元素有重复
        const { id } = JSON.parse(key) ?? 0;
        res.splice(res.findIndex(item => item.id === id), 1)
    }
}
console.log(res); // [{ id: 4 }, { id: 5 },]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

# 数组循环的方式

let arr3 = [{ code: 1, name: 'a' }, { code: 2, name: 'b' }, { code: 3, name: 'c' }],
    arr4 = [{ code: 1, name: 'a' }, { code: 2, name: 'b' }, { code: 3, name: 'c' }, { code: 4, name: 'f' }, { code: 5, name: 'e' }],
    newArr = deepClone(arr4);
    
arr4.map(item => {
    let val = arr3.findIndex(i => item.code === i.code)
    val !== -1 ? newArr[val]['repeat'] = true : '';
})
newArr = newArr.filter(i => !i.repeat);
console.log(newArr);  // [{ code: 4, name: 'f' }, { code: 5, name: 'e' }]
1
2
3
4
5
6
7
8
9
10

# 优化版

上面两种方式有个共同的问题,arr1和arr2必须完全一样才可以(数组内的对象属性一样,数组元素顺序一样),否则无法查找。

下面这种方式,即使两个数组顺序不同也可进行查找。

let arr1 = [{ code: 1, name: 'a' }, { code: 3, name: 'c' }],
    arr2 = [{ code: 1, name: 'a' }, { code: 2, name: 'b' }, { code: 3, name: 'c' }];

function getArrDifSameValue(arr1, arr2) {
    var result = [];
    for (var i = 0; i < arr2.length; i++) {
        var obj = arr2[i];
        var code = obj.code;
        var isExist = false;
        for (var j = 0; j < arr1.length; j++) {
            var aj = arr1[j];
            var n = aj.code;
            if (n == code) {
                isExist = true;
                break;
            }
        }
        if (!isExist) {
            result.push(obj);
        }
    }
    return result;
}
console.log(getArrDifSameValue(arr1, arr2)); // [{ code: 2, name: 'b' }]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

ES6再优化版

function getArrItems(arr1, arr2) {
    let res = [];
    arr2.forEach(item => {
        let flag = arr1.find(ite => return item.code === ite.code );
        if (!flag) {
            res.push(item);
        }
    })
    return res;
}
console.log(getArrItems(arr1, arr2));
1
2
3
4
5
6
7
8
9
10
11

原文链接:若依报错处理 # es6 filter 过滤数组 (opens new window)

js获取两个数组及数组对象中相同和不相同的值 (opens new window)

在GitHub上编辑 (opens new window)
#js
上次更新: 2/23/2022, 5:36:03 PM

← 树形结构转一维数组 因为数据类型导致的排序错乱问题→

最近更新
01
createElement函数创建虚拟DOM
05-26
02
clipboard 剪切板属性
05-26
03
vue的权限管理
05-16
更多文章>
Theme by Vdoing | Copyright © 2021-2022 Xin | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式
×