功能JavaScript:生成唯一值数组

时间:2014-12-13 15:30:27

标签: javascript arrays functional-programming

使用JavaScript中的函数编程从另一个数组中生成一组唯一值的方法是什么?

这应该:toUnique([1,1,2,3,4,4]) => [1,2,3,4]

3 个答案:

答案 0 :(得分:2)

查看uniq功能性JavaScript库的Ramda功能。

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.filterArray.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]

这是纯粹的功能解决方案,根据要求(实际上是nub的直接端口)。对于实用,请考虑其中一个答案over here