使用JavaScript中的函数编程从另一个数组中生成一组唯一值的方法是什么?
这应该:toUnique([1,1,2,3,4,4]) => [1,2,3,4]
答案 0 :(得分:2)
R.uniq([1, 1, 2, 1]); //=> [1, 2]
R.uniq([{}, {}]); //=> [{}, {}]
R.uniq([1, '1']); //=> [1, '1']
您可以使用库中的功能或查看source code ...
function uniq(list) {
var idx = -1, len = list.length;
var result = [], item;
while (++idx < len) {
item = list[idx];
if (!_contains(item, result)) {
result[result.length] = item;
}
}
return result;
};
答案 1 :(得分:1)
好吧,如果您不担心性能,我会使用Array.prototype.filter
和Array.prototype.indexOf
,就像这样
function toUnique(array) {
return array.filter(function(currentItem, index) {
return (index === array.indexOf(currentItem));
});
}
console.log(toUnique([1, 1, 2, 3, 4, 4]));
# [ 1, 2, 3, 4 ]
如果您可以使用任何其他库,则可以使用lodash's uniq
function,如此
_.uniq([1, 1, 2, 3, 4, 4]);
// → [1, 2, 3, 4]
它还可以利用输入数组已经排序的事实。所以,你可能想像这样调用它
_.uniq([1, 1, 2, 3, 4, 4], true);
// → [1, 2, 3, 4]
答案 2 :(得分:1)
之前已经被问过并回答了1000次,但是既然您要求提供功能性编程解决方案,请转到此处:
head = function(ls) { return ls[0] };
tail = function(ls) { return ls.slice(1) };
empty = function(ls) { return ls.length == 0 };
cons = function(a, b) { return [a].concat(b) };
has = function(x, ls) {
return empty(ls) ? false : head(ls) == x || has(x, tail(ls));
};
_uniq = function(ls, seen) {
return empty(ls) ? [] :
has(head(ls), seen) ?
_uniq(tail(ls), seen) :
cons(head(ls),
_uniq(tail(ls),
cons(head(ls), seen)));
};
uniq = function(ls) {
return _uniq(ls, []);
};
console.log(uniq([1,1,2,3,1,2,5])); // [1,2,3,5]