在数组数组上使用lodash unique

using lodash unique on an array of arrays

本文关键字:数组 lodash unique      更新时间:2023-09-26

我不知道如何使用它从主数组中删除重复的数组。因此考虑以下内容:

var arr = [
    [0, 1],
    [0, 1],
    [2, 1],
];

得到的数组应该看起来像:

var arr = [
    [0, 1],
    [2, 1],
];

文档对于单个元素数组是有意义的,但对于2d数组则没有意义。

想法

更新,一些解决方案的一个小问题:

要变为唯一的数组可能具有:

var arr = [
  [0, 1]
  [0, 2]
  [0, 3]
  [0, 1]
  [2, 1]
]

数组旁边的数组应该比较所有值,所以在上面的例子中,它应该吐出:

var arr = [
  [0, 1]
  [0, 2]
  [0, 3]
  [2, 1]
]

副本为[0, 1]

最简单的方法可能是使用uniq方法,然后将内部数组转换为某种字符串表示,JSON.stringify应该是足够好的解决方案。

var arr = [[0, 1], [0, 2], [0, 3], [0, 1], [2, 1]]
_.uniq(arr, function(item) { 
    return JSON.stringify(item); 
});
// [[0,1], [0,2], [0,3], [2,1]]

您可以在lodash:中使用.uniq函数

var arr = [
    [0, 1],
    [0, 1],
    [2, 1],
]
var uniqueList = _.uniq(arr, function(item, key, a) { 
    return item.a;
});

得到的数组看起来像:

//var arr = [Object: [0, 1], Object: [2, 1]];

当然,转换为JSON是可行的,但感觉我们可能在浪费资源。我在Node.js中使用以下Lodash代码:

const _ = require("lodash");
var arr = [
    [0, 1],
    [0, 1],
    [2, 1],
];
var uni = _.uniqWith(arr, _.isEqual);
console.log(uni);

效果很好,请查看此处的回复。更多关于uniqWith的信息,请访问Lodash文档。

它不使用lodash,没有优化我同意:

//remove duplicate array of array of arrays
Array.prototype.uniqueArray = function() {
    var uniqObj = {};
    this.forEach(function (item) {
        uniqObj[JSON.stringify(item)] = 1;
    });
    var uniqArray = [];
    for(var key in uniqObj) {
        if (uniqObj.hasOwnProperty(key)) {
            uniqArray.push(JSON.parse(key))
        }
    }
    return uniqArray;
};