在Array中查找重复数组

Nei*_*unn 5 javascript arrays underscore.js lodash

给定一个数组数组,识别重复项的有效方法是什么?

var array = [
  [
    11.31866455078125,
    44.53836644772605
  ],
  [                     // <-- Here's the duplicate
    11.31866455078125,
    44.53836644772605
  ],
  [
    11.371536254882812,
    44.53836644772605
  ],
  [
    11.371536254882812,
    44.50140292110874
  ]
]
Run Code Online (Sandbox Code Playgroud)

我一直在研究这个lodash作为一个被接受的依赖,我得到如何使用_.uniqWith和返回"唯一"列表_.isEqual:

_.uniqWith(array,_.isEqual)
Run Code Online (Sandbox Code Playgroud)

将给出列表的"唯一"版本:

[ 
    [ 11.31866455078125,  44.53836644772605 ],
    [ 11.371536254882812, 44.53836644772605 ],
    [ 11.371536254882812, 44.50140292110874 ]
]
Run Code Online (Sandbox Code Playgroud)

但不仅仅是报告独特的元素,我只需要复制的元素,理想情况下是第一次出现的索引.

lodash通过我缺少的某些方法组合,这实际上是否涵盖在库中?或者我只需要编写循环来比较元素.

可能只是在这方面过度紧张,所以对这个问题的新目光会很受欢迎.

如果有适合的库方法,尝试不重写函数,所以我基本上坚持:

  1. 仅返回重复或至少与"唯一列表"的比较差异.

  2. 基本上识别数组中数组的"索引".虽然我认为_.isEqual一旦识别出重复的项目,就可以减少过滤器.

还试图避免创建一个对象Hash/Map并在这里计算键的出现次数,或者至少不作为单独的对象,以及可以在功能上"在线"完成的事情.

Dmi*_*tin 5

Lodash提供了许多有用的功能来实现查找第一个重复索引.
使用_.findIndex()_.isEqual(),以下代码将找到第一个重复索引:

var duplicateIndex = _.findIndex(array, function(value, index, collection) {
  var equal = _.isEqual.bind(undefined, value);
  return _.findIndex(collection.slice(0, index), equal) !== -1;
});
Run Code Online (Sandbox Code Playgroud)

或者更快但更冗长:

var duplicateIndex = _.findIndex(array, function(value, index, collection) {
  var equal = _.isEqual.bind(undefined, value);
  return _.findIndex(collection, function(val, ind) {
     return ind < index && equal(val);
  }) !== -1;
});
Run Code Online (Sandbox Code Playgroud)

请注意,如果不存在重复,-1则将返回.
简而言之,算法遍历数组并回顾当前元素是否已经存在.如果是,只返回当前的迭代索引.
请查看工作演示.