此问题在此处已有答案:
Get all unique values in a JavaScript array (remove duplicates)(91个答案)
去年关闭了。
在我的CouchDB reduce函数中,我需要将一个项目列表缩减为唯一的项目。
- 注意:在这种情况下,有一个列表是可以的,它将是一个字符串类型的少量项目。*
我目前的方法是设置一个对象的键,然后返回该对象的键,因为代码不能使用像_.uniq
这样的东西。
我想找一个比这更优雅的拼写方法。
function(keys, values, rereduce) {
// values is a Array of Arrays
values = Array.concat.apply(null, values);
var uniq = {};
values.forEach(function(item) { uniq[item] = true; });
return Object.keys(uniq);
}
9条答案
按热度按时间vh0rcniy1#
最好的方法似乎是使用ES6和Set.Single Line,而且比上面的 * 根据fiddle更快
t9aqgxwy2#
2021年答案:
在这里,您只需从给定的数组创建一个set,然后将其转换回数组。我测量了性能,现在它几乎比我之前发布的旧答案中提出的方法快两倍。而且,它只是一行程序。
Updated fiddle
旧答案仅供参考
一般来说,你使用的方法是一个好主意。但是我可以提出一个解决方案,这将使算法快得多。
如您所见,这里只有一个循环。
我已经做了一个example来测试你和我的解决方案。试着玩一下。
oxosxuxt3#
另一种适合小列表的方法是模仿
sort | uniq
的Unix命令行方法:此函数对参数进行排序,然后筛选结果以忽略与其前导项相等的任何项。
基于键的方法很好,并且对于大量的条目有更好的性能特征(将n个条目插入哈希表的时间复杂度为O(n),而对数组排序的时间复杂度为O(n log n))。然而,这在小列表中不太可能被注意到。此外,在这个版本中,如果需要的话,您可以修改它以使用不同的排序或等式函数;使用散列键时,您会被JavaScript中的键相等概念所束缚。
pkmbmrz74#
这应该适用于任何对象,而不仅仅是字符串:
上述内容可以简化为:
:)
tzxcd3kk5#
要获取唯一对象,可以使用
JSON.stringify
和JSON.parse
:eimct9ow6#
使用Object.keys可以给予字符串,如果你输入整型参数(uniq([1,2,3])=〉['1','2','3 ']。下面是一个使用Array.reduce的例子:
gmxoilav7#
这是一个老问题,我知道。但是,它是在一些谷歌搜索的顶部,所以我想补充说,你可以合并从@RobHague和@EugeneNaydenov的答案使用以下:
您还可以通过添加以下内容来忽略 undefined 值(通常很方便):
您可以在此处使用此解决方案:https://jsfiddle.net/s8d14v5n/
nhaq1z218#
我发现其他的答案是相当复杂的没有收获,我可以看到。
我们可以使用Array的indexOf方法在推入之前验证项目是否存在于其中:
这也适用于任何类型的变量,甚至是对象(假设标识符实际上引用了同一个实体,仅仅是等价的对象并不被视为相同)。
fdbelqdn9#
怎么样