JavaScript中如何对多维数组(矩阵)去重的实现


Posted in Javascript onDecember 04, 2019

今天碰到了一个问题,需要对一个数组矩阵进行去重处理。

比如如下数组矩阵:

[ [1, 2, 3], [2, 3, 4], [2, 1, 3], [5, 6, 7] ]

接下来是去重处理的方法。

1.适用于纯数字数组矩阵和字符数字数组矩阵

// 本节用例:
// 1.纯数字数组矩阵
[
  [1, 2, 3],
  [2, 3, 4],
  [2, 1, 3],
  [5, 6, 7]
]
// 2.字符数字数组矩阵
[
  ['1', '2', '3'],
  ['2', '3', '4'],
  ['2', '1', '3'],
  ['5', '6', '7']
]

// 如果数字和字符数字混合的话,类似于 [1, '2', 3] 和 ['1', '2', 3] 会被认为是等价的...

主要利用对象属性名比较的方法,因为一个对象中每个属性的属性名是唯一的。

function unique(matrix) {
  let obj = {};
  let res = [];
  matrix.map(item => {
    item.sort((a, b) => a - b);
    if (!obj.hasOwnProperty(item)) {// 判断对象中是否有这个属性名
      obj[item] = item;
      res.push(item);
    }
  })
  return res;
}

上面的方法可以进一步优化成为:

// 这样更简洁
function unique(matrix) {
  let res = {};
  matrix.map(item => {
    item.sort((a, b) => a - b);
    res[item] = item;
  })
  return Object.values(res);
}

2.适用于纯文字字符数组矩阵

// 本节用例:
// 纯文字字符数组矩阵
[
  ["你的", "我", "它"],
  ["我", "你的", "它"],
  ["一", "二", "三"],
  ["三", "二", "一"],
  ["你d", "a", "它"],
  ["a", "你d", "它"],
  ["one", "two", "three"],
  ["three", "two", "one"]
]

分别利用对象属性名比较和ES6语法中的Set

(1) 利用属性名比较,将上面的方法稍微改动一下就可以实现

// 数组元素可能位置不同但元素内容相同,所以必须按照某一顺序对其进行排序,这里按首字母对字符串进行排序
function _unique(matrix) {
  let res = {};
  matrix.map(item => {
    item.sort((a, b) => a.localeCompare(b));
    res[item] = item;
  })
  return Object.values(res);
}

(2) 利用ES6语法中的Set,Set中的每个值都是唯一的

function _unique(matrix) {
  let res = [];
  matrix.map(item => {
    res.push(item.sort((a, b) => a.localeCompare(b)).toString());
  })
  // return Array.from(new Set(res)).map(item => item.split(','))
  return [...new Set(res)].map(item => item.split(','));// 上下等价
}

源码在此

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
用jQuery中的ajax分页实现代码
Sep 20 Javascript
ajax异步刷新实现更新数据库
Dec 03 Javascript
判断JS对象是否拥有某种属性的两种方式
Dec 02 Javascript
js格式化时间和js格式化时间戳示例
Feb 10 Javascript
js function定义函数的几种不错方法
Feb 27 Javascript
Jquery组件easyUi实现表单验证示例
Aug 23 Javascript
详解Javascript中prototype属性(推荐)
Sep 03 Javascript
AngularJS学习第一篇 AngularJS基础知识
Feb 13 Javascript
JS与jQuery实现子窗口获取父窗口元素值的方法
Apr 17 jQuery
Vue-cli proxyTable 解决开发环境的跨域问题详解
May 18 Javascript
vue自定义指令之面板拖拽的实现
Apr 14 Javascript
vue总线机制(bus)知识点详解
May 10 Javascript
Vue实现base64编码图片间的切换功能
Dec 04 #Javascript
Vue实现点击当前元素以外的地方隐藏当前元素(实现思路)
Dec 04 #Javascript
Vue实现图片与文字混输效果
Dec 04 #Javascript
环形加载进度条封装(Vue插件版和原生js版)
Dec 04 #Javascript
element-ui 远程搜索组件el-select在项目中组件化的实现代码
Dec 04 #Javascript
在vue和element-ui的table中实现分页复选功能
Dec 04 #Javascript
vue项目中极验验证的使用代码示例
Dec 03 #Javascript
You might like
php imagecreatetruecolor 创建高清和透明图片代码小结
2010/05/15 PHP
php垃圾代码优化操作代码
2010/08/05 PHP
ASP和PHP实现生成网站快捷方式并下载到桌面的方法
2014/05/08 PHP
Zend Framework动作助手FlashMessenger用法详解
2016/03/05 PHP
jQueryUI写一个调整分类的拖放效果实现代码
2012/05/10 Javascript
借助script进行Http跨域请求:JSONP实现原理及代码
2013/03/19 Javascript
ComboBox 和 DateField 在IE下消失的解决方法
2013/08/30 Javascript
HTML+CSS+JS实现完美兼容各大浏览器的TABLE固定列
2015/04/26 Javascript
使用DNode实现php和nodejs之间通信的简单实例
2015/07/06 NodeJs
jquery实现像栅栏一样左右滑出式二级菜单效果代码
2015/08/24 Javascript
深入解析JavaScript编程中的this关键字使用
2015/11/09 Javascript
jQuery自定义图片缩放拖拽插件imageQ实现方法(附demo源码下载)
2016/05/27 Javascript
详解js中的apply与call的用法
2016/07/30 Javascript
vue事件修饰符和按键修饰符用法总结
2017/07/25 Javascript
vue绑定设置属性的多种方式(5)
2017/08/16 Javascript
JavaScript中变量提升与函数提升经典实例分析
2018/07/26 Javascript
jQuery实现的自定义轮播图功能详解
2018/12/28 jQuery
解决layui页面按钮点击无反应,也不报错的问题
2019/09/29 Javascript
Vue如何基于vue-i18n实现多国语言兼容
2020/07/17 Javascript
[24:42]VP vs TNC Supermajor小组赛B组 BO3 第三场 6.2
2018/06/03 DOTA
利用Python的Twisted框架实现webshell密码扫描器的教程
2015/04/16 Python
举例详解Python中threading模块的几个常用方法
2015/06/18 Python
Python单体模式的几种常见实现方法详解
2017/07/28 Python
Python爬虫实现百度图片自动下载
2018/02/04 Python
python tornado微信开发入门代码
2018/08/24 Python
基于Python实现用户管理系统
2019/02/26 Python
澳大利亚最好的厨具店:Kitchen Warehouse
2018/03/13 全球购物
XML文档定义有几种形式?它们之间有何本质区别?解析XML文档有哪几种方式?
2016/01/12 面试题
前台接待的工作职责
2013/11/21 职场文书
中学劳技课教师的自我评价
2014/02/05 职场文书
2014县委书记四风对照检查材料思想汇报
2014/09/21 职场文书
保密工作整改报告
2014/11/06 职场文书
2015年司机年终工作总结
2015/05/14 职场文书
付款证明格式范文
2015/06/19 职场文书
先进党支部事迹材料2016
2016/02/26 职场文书
使用 Docker Compose 构建复杂的多容器App
2022/04/30 Servers