如何在JavaScript中创建唯一项的列表?

如何在JavaScript中创建唯一项的列表?,javascript,arrays,couchdb,Javascript,Arrays,Couchdb,在我的CouchDB reduce函数中,我需要将项目列表缩减为唯一的项目 注意:在这种情况下,可以有一个列表,它将是一小部分字符串类型的项目 我目前的方法是设置对象的关键点,然后返回该对象的关键点 因为代码所在的位置不能使用像\uq.uniq这样的东西 我想找一个比这个更优雅的拼写方法 function(keys, values, rereduce) { // values is a Array of Arrays values = Array.concat.apply(null, v

在我的CouchDB reduce函数中,我需要将项目列表缩减为唯一的项目

注意:在这种情况下,可以有一个列表,它将是一小部分字符串类型的项目

我目前的方法是设置对象的关键点,然后返回该对象的关键点 因为代码所在的位置不能使用像
\uq.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);
}

通常,您使用的方法是一个好主意。 但我可以提出一个解决方案,使算法更快

function unique(arr) {
    var u = {}, a = [];
    for(var i = 0, l = arr.length; i < l; ++i){
        if(!u.hasOwnProperty(arr[i])) {
            a.push(arr[i]);
            u[arr[i]] = 1;
        }
    }
    return a;
}
功能唯一性(arr){
变量u={},a=[];
对于(变量i=0,l=arr.length;i
正如你所看到的,我们这里只有一个循环

我已经做了一个测试,测试您和我的解决方案。试着玩它。

怎么样

    function unique(list) {
      for (i = 0; i<list.length; i++) {
        for (j=i+1; j<list.length; j++) {
          if (list[i] == list[j]) {
            list.splice(j, 1);
          }
        }
      }
    }
功能唯一(列表){

对于(i=0;i一种适合小列表的替代方法是模仿Unix命令行方法
sort | uniq

    function unique(a) {
        return a.sort().filter(function(value, index, array) {
            return (index === 0) || (value !== array[index-1]);
        });
    }
此函数对参数进行排序,然后过滤结果,以忽略与其前置项相等的任何项


基于键的方法很好,并且对于大量项(O(n)用于将n个项插入哈希表,而O(n log n)用于排序数组)具有更好的性能特征但是,这在小列表上不太可能被注意到。此外,在这个版本中,如果需要的话,您可以修改它以使用不同的排序或相等函数;对于散列键,您会被JavaScripts的键相等概念所困扰。

我知道这是一个老问题。但是,它在一些google搜索中处于顶部,所以我想添加它您可以使用以下方法组合@RobHague和@EugeneNaydenov的答案:

function unique(arr) {
  const u = {};
  return arr.filter((v) => {
    return u[v] = !u.hasOwnProperty(v);
  });
};
还可以通过添加以下内容忽略未定义的值(通常很方便):

function unique(arr) {
  const u = {};
  return arr.filter((v) => {
    return u[v] = (v !== undefined && !u.hasOwnProperty(v));
  });
};

您可以在此处使用此解决方案:

使用Object.keys将为您提供字符串,如果您输入整数参数(uniq([1,2,3])=>['1','2','3'])。下面是一个使用Array.reduce:

function uniq(list) {
    return list.reduce((acc, d) => acc.includes(d) ? acc : acc.concat(d), []);
}

这应该适用于任何东西,而不仅仅是字符串:

export const getUniqueList =  (a: Array<any>) : Array<any> => {

  const set = new Set<any>();

  for(let v of a){
      set.add(v);
  }

  return Array.from(set);

};
export const getUniqueList=(a:Array):Array=>{
常量集=新集();
for(让v of a){
增加(v);
}
返回数组.from(set);
};
以上内容可简化为:

export const getUniqueValues = (a: Array<any>) => {
   return Array.from(new Set(a));
};
export const getUniqueValues=(a:Array)=>{
返回数组.from(新集合(a));
};

:)

最好的方法似乎是使用ES6和Set。单行和更快*根据


常数myList=[1,4,5,1,2,4,5,6,7];
const unique=[…新集合(myList)];

console.log(唯一);
我发现其他答案相当复杂,我看不出有什么好处

在推送之前,我们可以使用数组的方法验证其中是否存在项:

const duplicated_value=['1','1','1','2','3','3','4'];
const unique_list=[];
重复的_值。forEach(值=>{
if(唯一列表索引of(值)=-1){
唯一列表。推送(值);
}
});

console.log(唯一列表)
根据您定义为优雅的内容,您可以在GitHub上查找下划线唯一值的来源。仅字符串的下划线更昂贵,而由于需要在一般情况下使用,因此不太优雅。您需要reduce函数吗?如果您只需要唯一值,则在请求t时可以使用
group=true
选项查看。有关该视图的更多信息,请参阅[Get all unique Value in a array(移除重复项)]的可能重复。这是否回答了您的问题?我希望更漂亮,但加速是相当重要的。当您处理集合和循环时,算法的速度始终很重要。如果我要使用
(var i=0;i@MarkusMeskanen这取决于特定的JavaScript引擎实现。此外,请不要忘记属性查找时间。仅供参考,这两种解决方案都不适用于对象。例如,
unique([{},{a:1}])==[{}]
-这是因为您只能将字符串用作对象键。同样:
unique(['1',1])==['1']
在运行list.splice()之后,您需要减小j。这种O(N^2)解决方案适用于小型阵列,但一旦阵列变大,我就不会使用它。很漂亮,我们能够在ember.js中使用它来使用Arrayproxy的“filter”功能过滤记录阵列,您也可以只需执行
新设置([1,2,4,6])
新集合(列表)只会创建一个集合。是的,你是对的,我的意思是
数组。从(新集合([1,2,4,6])
,请参阅我的答案可能使用
新集合
获得更多乐趣