web-dev-qa-db-ja.com

lodashを使用して、配列に重複した値があるかどうかを確認する

配列の重複値をチェックするために、lodashユーティリティを使用して関数を記述する最良の方法(最良の読みやすさまたは最もパフォーマンスの良い選択として解釈できる)はどうでしょうか。

['foo', 'foo', 'bar']を入力し、関数がtrueを返すようにします。そして、['foo', 'bar', 'baz']を入力し、関数がfalseを返すようにします。

20
nackjicholson

このコードを試すことができます:

function hasDuplicates(a) {
  return _.uniq(a).length !== a.length; 
}

var a = [1,2,1,3,4,5];
var b = [1,2,3,4,5,6];

document.write(hasDuplicates(a), ',',hasDuplicates(b));
<script src="http://cdnjs.cloudflare.com/ajax/libs/lodash.js/3.1.0/lodash.min.js"></script>
42
agershun

配列内で_.some要素が存在することを確認できます。この要素は、配列内を検索したときに独自の場所を返しません。言い換えると、配列内で以前に一致した要素が少なくとも1つあります。

function hasDuplicates(array) {
    return _.some(array, function(elt, index) { 
        return array.indexOf(elt) !== index; 
    });
}

おそらく、これは_.uniqソリューションよりも高速です。一意の配列全体を計算しなくても、最初に複製された要素をすぐに特定できるからです。

または、コーディングスタイルと読みやすさの要望、および簡潔にするためにES6の矢印関数を使用する場合は、次のようにします。

var earlierMatch  = (elt, index, array) => array.indexOf(elt) !== index;
var hasDuplicates = array => _.some(array, earlierMatch);
8
user663031

まあ、常にあります。 lodashの _。uniq() 関数。この関数は実際には一意の値のみを含む新しい配列を返すため、配列の長さが変更されたかどうかを確認すると、「true」または「false」の値が返されます。

2
Paul Wostenberg

私はlodashを知りませんが、私は提出します:

_.any(_.countBy(['foo', 'foo', 'bar']), function(x){ return x > 1; });

これまでに提案されたすべての解決策の問題は、回答が配列の最初の2つの要素から明らかな場合でも、入力配列全体が回答を得るための処理を必要とすることです。

2
sebnukem

ES6の時点では、単純に Set を使用できるため、次のようになります。

let hasDuplicates = arr => new Set(arr).size != arr.length

console.log(hasDuplicates([5,3,2,1,2,1,2,1]))
console.log(hasDuplicates([1,2,3,4,5]))

これは、この特定のケースでlodashの使用をいくらか無効にします。

1
Akrion

lodashを使用する必要はありません。代わりに次のコードを使用してください。

function getDuplicates(array, key) {
  return array.filter(e1=>{
    if(array.filter(e2=>{
      return e1[key] === e2[key];
    }).length > 1) {
      return e1;
    }
  })
}
0
Hushen Savani