JS - 算法 - 数组去重 - 重载 equal 运算的数组去重

发布于 2022-09-02 15:19:22 字数 512 浏览 18 评论 0

20160512 修改:避免歧义


输入:

[ [ 1, 1 ], [ 1, 1 ], [ 1, -1 ], [ 1, -1 ], [ 1, 1 ], [ 1, -1 ] ]

定义形如 [ 1, 1 ] 的元素为向量

向量相等遵从以下算法:

function vectorEquality(u, v) {
    return u.length === v.length && !u.some((x, i) => x !== v[i]);
}

要求以以上算法为标准进行数组去重

即输出:

[ [ 1, 1 ], [ 1, -1 ] ]

要求:

尽量降低算法复杂度

尽量使用原生函数

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

溇涏 2022-09-09 15:19:22
var a =[ [ 1, 1 ], [ 1, 1 ], [ 1, -1 ], [ 1, -1 ], [ 1, 1 ], [ 1, -1 ] ];
var res= [...new Map(a.map(([a,b]) => [a+','+b,[a,b]])).values()]
秉烛思 2022-09-09 15:19:22

看看Lodash的_.uniq方法,这个库可以让你写出很优雅的代码。(类似java中的guava工具库)

迷雾森÷林ヴ 2022-09-09 15:19:22

先做出几点假设:
1.数组里都是数字数组,没有字母或者其他复杂对象;
2.[1,-1]和 [-1,1]我们将视为同一对象,两个中只存一个

实现:

var orginArray=[ [1,-1],[ 1, 1 ], [ 1, 1 ], [ 1, -1 ], [ 1, -1 ], [ 1, 1 ], [ 1, -1 ] ],//原数组
        newArray=[],//新数组用于接收去重后的数字数组
        keyMap={};//用于记录已经存在的键
    orginArray.map(function(_this){
        var _tempKey=_this.sort().toString();//将原数组元素自然排序并转换为字符串
        if(_tempKey in keyMap){//如果键在keyMap中,则说明新数组中已经有这个元素
            return;
        }
        //若键不在keyMap中,则把当前元素扔到新数组中,并用keyMap记录
        newArray.push(_this);
        keyMap[_tempKey]=_this;
        
    })
    
    console.info("去重后的数组:",newArray);
    
    
    

简单封装下:

Array.prototype.removeRepeat = function() {
    var orginArray = this, //原数组
        newArray = [], //新数组用于接收去重后的数字数组
        keyMap = {}; //用于记录已经存在的键
    orginArray.map(function(_this) {
        var _tempKey = _this.sort().toString(); //将原数组元素自然排序并转换为字符串
        if (_tempKey in keyMap) { //如果键在keyMap中,则说明新数组中已经有这个元素
            return;
        }
        //若键不在keyMap中,则把当前元素扔到新数组中,并用keyMap记录
        newArray.push(_this);
        keyMap[_tempKey] = _this;

    })
    return newArray;
}
var orginArray=[ [1,-1],[ 1, 1 ], [ 1, 1 ], [ 1, -1 ], [ 1, -1 ], [ 1, 1 ], [ 1, -1 ] ];
console.info("去重后的数组:",orginArray.removeRepeat());
乖不如嘢 2022-09-09 15:19:22

如果都是简单对象 可以JSON化然后比较字符串

野味少女 2022-09-09 15:19:22

推荐看看Lodash

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文