配列の重複値をチェックするために、lodashユーティリティを使用して関数を記述する最良の方法(最良の読みやすさまたは最もパフォーマンスの良い選択として解釈できる)はどうでしょうか。
['foo', 'foo', 'bar']
を入力し、関数がtrue
を返すようにします。そして、['foo', 'bar', 'baz']
を入力し、関数がfalse
を返すようにします。
このコードを試すことができます:
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>
配列内で_.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);
まあ、常にあります。 lodashの _。uniq() 関数。この関数は実際には一意の値のみを含む新しい配列を返すため、配列の長さが変更されたかどうかを確認すると、「true」または「false」の値が返されます。
私はlodashを知りませんが、私は提出します:
_.any(_.countBy(['foo', 'foo', 'bar']), function(x){ return x > 1; });
これまでに提案されたすべての解決策の問題は、回答が配列の最初の2つの要素から明らかな場合でも、入力配列全体が回答を得るための処理を必要とすることです。
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の使用をいくらか無効にします。
lodash
を使用する必要はありません。代わりに次のコードを使用してください。
function getDuplicates(array, key) {
return array.filter(e1=>{
if(array.filter(e2=>{
return e1[key] === e2[key];
}).length > 1) {
return e1;
}
})
}