22

私のCouchDBreduce関数では、アイテムのリストを一意のものに減らす必要があります。

注:その場合、リストがあってもかまいませんが、文字列型のアイテムは少数になります。

私の現在の方法は、オブジェクトのキーを設定してから、そのオブジェクトのキーを返すことです。これは、コードが_.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);
}
4

9 に答える 9

31

2021年の答え:

const unique = (arr) => [...new Set(arr)];
unique([1, 2, 2, 3, 4, 4, 5, 1]); // [1, 2, 3, 4, 5]

ここでは、指定された配列からセットを作成し、それを配列に変換します。パフォーマンスを測定したところ、以前に投稿した古い回答で提案されたアプローチよりもほぼ 2 倍高速になりました。また、それは単なるワンライナーです。

更新されたフィドル

記録のための古い回答:

通常、あなたが使用したアプローチは良い考えです。しかし、アルゴリズムを大幅に高速化するソリューションを提案できます。

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;
}

ご覧のとおり、ここにはループが 1 つしかありません。

あなたと私のソリューションの両方をテストするを作成しました。遊んでみてください。

于 2012-08-11T02:59:05.063 に答える
10

小さなリストに適した代替手段は、次の Unix コマンド ライン アプローチを模倣することですsort | uniq

    function unique(a) {
        return a.sort().filter(function(value, index, array) {
            return (index === 0) || (value !== array[index-1]);
        });
    }

この関数は、引数を並べ替え、結果をフィルター処理して、前の引数と等しい項目を除外します。

キーベースのアプローチは問題なく、多数のアイテムに対してより優れたパフォーマンス特性を持ちます (配列をソートするための O(n log n) と比較して、n 個のアイテムをハッシュテーブルに挿入するための O(n))。ただし、これは小さなリストでは目立たないでしょう。さらに、このバージョンでは、必要に応じて、別の並べ替えまたは等価関数を使用するように変更できます。ハッシュ キーを使用すると、キーの等価性に関する JavaScript の概念に固執します。

于 2015-07-01T10:37:59.493 に答える
0

JSON.stringify一意のオブジェクトを取得するには、とを使用できますJSON.parse

const arr = [{test: "a"}, {test: "a"}];
const unique = Array.from(new Set(arr.map(JSON.stringify))).map(JSON.parse);
console.log(unique);

于 2021-07-02T09:42:44.953 に答える
-1

どうですか

    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);
          }
        }
      }
    }
于 2014-09-11T18:07:25.890 に答える