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通过我缺少的某些方法组合,这实际上是否涵盖在库中?或者我只需要编写循环来比较元素.
可能只是在这方面过度紧张,所以对这个问题的新目光会很受欢迎.
如果有适合的库方法,尝试不重写函数,所以我基本上坚持:
仅返回重复或至少与"唯一列表"的比较差异.
基本上识别数组中数组的"索引".虽然我认为_.isEqual一旦识别出重复的项目,就可以减少过滤器.
还试图避免创建一个对象Hash/Map并在这里计算键的出现次数,或者至少不作为单独的对象,以及可以在功能上"在线"完成的事情.
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则将返回.
简而言之,算法遍历数组并回顾当前元素是否已经存在.如果是,只返回当前的迭代索引.
请查看工作演示.
| 归档时间: |
|
| 查看次数: |
619 次 |
| 最近记录: |