これを使用できます:
_.filter(arr, (val, i, iteratee) => _.includes(iteratee, val, i + 1));
配列に数字が2回以上現れる場合は、常に_.uniq
を使用できることに注意してください。
別の方法は、一意のアイテムでグループ化し、複数のアイテムを持つグループキーを返すことです
_([1, 1, 2, 2, 3]).groupBy().pickBy(x => x.length > 1).keys().value()
var array = [1, 1, 2, 2, 3];
var groupped = _.groupBy(array, function (n) {return n});
var result = _.uniq(_.flatten(_.filter(groupped, function (n) {return n.length > 1})));
これは、並べ替えられていない配列でも機能します。
別の方法、ただしフィルターとecmaScript 2015(ES6)を使用
var array = [1, 1, 2, 2, 3];
_.filter(array, v =>
_.filter(array, v1 => v1 === v).length > 1);
//→ [1, 1, 2, 2]
countBy()
に続いてreduce()
を使用するのはどうですか?
const items = [1,1,2,3,3,3,4,5,6,7,7];
const dup = _(items)
.countBy()
.reduce((acc, val, key) => val > 1 ? acc.concat(key) : acc, [])
.map(_.toNumber)
console.log(dup);
// [1, 3, 7]
これは、私のes6のような、depsフリーの答えです。レデューサーの代わりにフィルターを使用
// this checks if elements of one list contains elements of second list
// example code
[0,1,2,3,8,9].filter(item => [3,4,5,6,7].indexOf(item) > -1)
// function
const contains = (listA, listB) => listA.filter(item => listB.indexOf(item) > -1)
contains([0,1,2,3], [1,2,3,4]) // => [1, 2, 3]
// only for bool
const hasDuplicates = (listA, listB) => !!contains(listA, listB).length
編集:うーん私の悪いことです:私は一般的な質問としてqを読んでいますが、これは厳密にlodashのためですが、私のポイントは-ここにlodashは必要ありません:)
このコードは、O(n))の複雑さを持ち、これはLodashを使用しないため、はるかに高速です。
[1, 1, 2, 2, 3]
.reduce((agg,col) => {
agg.filter[col] = agg.filter[col]? agg.dup.Push(col): 2;
return agg
},
{filter:{},dup:[]})
.dup;
//result:[1,2]
別の簡潔なソリューションを次に示します。
let data = [1, 1, 2, 2, 3]
let result = _.uniq(_.filter(data, (v, i, a) => a.indexOf(v) !== i))
console.log(result)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script>
_.uniq
は、_.filter
が戻ってきます。
ES6および Set と同じ:
let data = [1, 1, 2, 2, 3]
let result = new Set(data.filter((v, i, a) => a.indexOf(v) !== i))
console.log(Array.from(result))
以下のソリューションがあなたを助け、それがすべての条件で役立つことを願っています
hasDataExist(listObj, key, value): boolean {
return _.find(listObj, function(o) { return _.get(o, key) == value }) != undefined;
}
let duplcateIndex = this.service.hasDataExist(this.list, 'xyz', value);
lodash
を使用する必要はありません。次のコードを使用できます。
function getDuplicates(array, key) {
return array.filter(e1=>{
if(array.filter(e2=>{
return e1[key] === e2[key];
}).length > 1) {
return e1;
}
})
}