2016-05-04 9 views
2

Ich habe ein Array, um zu vereinfachen sagen Personen mit ersten, letzten und Alter. Ich möchte ein neues Array aller Personen erstellen, die denselben Vornamen, denselben Nachnamen und dasselbe Alter haben. Zum Beispiel mein Ausgangs Array:lodash Javascript Array von Duplikaten, die mehrere Parameter entsprechen

[ 
    {id: 1, first: 'fred', last: 'smith', age: 21}, 
    {id: 2, first: 'fred', last: 'smith', age: 21}, 
    {id: 3, first: 'tom', last: 'smith', age: 21}, 
    {id: 4, first: 'fred', last: 'smith', age: 32} 
] 

Ich möchte die Duplikate zurückzugeben, die erste/letzte/Alter entsprechen:

[ 
    {id: 1, first: 'fred', last: 'smith', age: 21}, 
    {id: 2, first: 'fred', last: 'smith', age: 21} 
] 

Ich kämpfe mit _.uniq, um herauszufinden, wie dies zu tun Jede Hilfe wird geschätzt.

+1

Würde '.reduce()' tun, was Sie wollen? Vergleichen Sie jedes Element mit dem vorherigen, und wenn sie übereinstimmen, geben Sie das spätere zurück? – evolutionxbox

+0

Was passiert, wenn es 2 Freds und 2 Toms gibt? Was erwartest du als Gegenleistung? –

+0

@ Felipe Skinner, wenn es 2 Freds mit dem gleichen Nachnamen und Alter gibt, sollten sie enthalten sein, wenn es 2 Toms mit demselben Nachnamen und Alter gibt, sollten sie auch enthalten sein, im Grunde alle Datensätze, die in allen drei Kriterien übereinstimmen . – edencorbin

Antwort

3

Sie können _.groupBy() verwenden, um Werte zu gruppieren. Stellen Sie sicher, dass sie nach Werten gruppiert sind, die Sie als Kriterien für ein Duplikat festlegen. Sie können dann _.filter() jede gruppierte Werte durch die Längen der Arrays, die sie angesammelt haben und dann _.flatten() es, um das endgültige Array zu erhalten.

var data = [ 
 
    {id: 1, first: 'fred', last: 'smith', age: 21}, 
 
    {id: 2, first: 'fred', last: 'smith', age: 21}, 
 
    {id: 3, first: 'tom', last: 'smith', age: 21}, 
 
    {id: 4, first: 'fred', last: 'smith', age: 32} 
 
]; 
 

 
var result = _(data) 
 
    .groupBy(i => _(i).pick('first', 'last', 'age').values().value()) 
 
    .filter(i => i.length > 1) 
 
    .flatten() 
 
    .value(); 
 

 
document.write('<pre>' + JSON.stringify(result, 0, 4) + '</pre>');
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.11.2/lodash.js"></script>

+0

Arbeitete perfekt, danke. – edencorbin

+0

Danke, dass Sie mir die Multi-Property-Form von 'Pick' vorgestellt haben. –

Verwandte Themen