web-dev-qa-db-ja.com

lodash:配列から重複した値を取得する

次のような配列があるとします:[1, 1, 2, 2, 3]

この場合の重複を取得したい:[1, 2]

lodash はこれをサポートしますか?できるだけ最短でやりたいです。

25
zianwar

これを使用できます:

_.filter(arr, (val, i, iteratee) => _.includes(iteratee, val, i + 1));

配列に数字が2回以上現れる場合は、常に_.uniqを使用できることに注意してください。

33
saadel

別の方法は、一意のアイテムでグループ化し、複数のアイテムを持つグループキーを返すことです

_([1, 1, 2, 2, 3]).groupBy().pickBy(x => x.length > 1).keys().value()
20
Gaafar
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})));

これは、並べ替えられていない配列でも機能します。

13
Mikhail Romanov

別の方法、ただしフィルターとecmaScript 2015(ES6)を使用

var array = [1, 1, 2, 2, 3];

_.filter(array, v => 
  _.filter(array, v1 => v1 === v).length > 1);

//→ [1, 1, 2, 2]
5
Rafael Zeffa

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]

http://jsbin.com/panama/edit?js,console

4
Brian Park

これは、私の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のためですが、私のポイントは-ここにlod​​ashは必要ありません:)

1
vonsko

このコードは、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]
1
Rahul Surabhi

別の簡潔なソリューションを次に示します。

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))
0
Akrion

以下のソリューションがあなたを助け、それがすべての条件で役立つことを願っています

  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);
0

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