2016-06-02 4 views
4

Ich habe zwei Arrays [a,b,c,d] und [b,d,f,h].Array-Schnittpunkt (set-theoretische) mit Array.prototype.reduce

Ich möchte ein Array zurück mit den gemeinsamen Elementen [b,d] bekommen.

[a,b,c,d].filter(el => [b,d,f,h].indexOf(el) !== -1) 

aber ich frage mich, ob und wie ich mit reduce das gleiche tun:

Ich kann das mit einer Kombination aus filter und indexOf erreichen.

Ich gebe zu, dass reduce für mich immer noch eine der undurchsichtigsten JS-Methoden ist, obwohl ich mir viele Beispiele anschaue, also würde ich wirklich einige Ratschläge zu schätzen wissen.

+0

Versuchen erfinden zu implementieren 'filter' mit' reduce' – Bergi

Antwort

3

ES6, eine propoosal mit Array#includes

Die includes() Verfahren bestimmt, ob ein Feld ein bestimmtes Element enthält, zurückkehr true oder false als angemessen.

Auf jeder Schleife von aa reduzieren addiert das Element auf den Ergebnis-Array, wenn der Wert in dem Testarray bb gefunden wird. Wenn nicht gefunden, wird das vorherige Ergebnis zurückgegeben.

var aa = ['a','b','c','d'], 
 
    bb = ['b','d','f','h'], 
 
    cc = aa.reduce((r, a) => bb.includes(a) && r.concat(a) || r, []); 
 

 
console.log(cc);

Nur ein intelligenter Ansatz mit einer einzigen Array, das alle Arrays enthält.

var aa = ['a','b','c','d'], 
 
    bb = ['b','d','f','h'], 
 
    result = [aa, bb].reduce((a, b) => a.filter(c => b.includes(c))); 
 

 
console.log(result);

+0

Ich mag das sehr, danke! Kennen Sie eine Möglichkeit, 'reduce' _only_ zu verwenden, um dasselbe Ergebnis zu erzielen? –

+0

meinst du ohne includes oder indexof? –

+0

Ja, das liegt wohl daran, dass ich "reduce" nicht verstehe. –

2

Reduce wurde entwickelt, um einen einzelnen Wert aus einer Liste von Elementen zurückzugeben. Also macht Filter hier viel mehr Sinn.

Eine gute Verwendung für reduzieren wäre, die Gesamtzahl der gemeinsamen Elemente zurückzugeben. Überprüfen Sie es hier aus: https://jsfiddle.net/c69vgzL4/

var a = ['a','b','c','d'] 
var b = ['b','d','f','h'] 

var number_of_common = b.reduce(function(prev, next) { 
    return prev + (a.indexOf(next) + 1 ? 1 : 0) 
}, 0) 

$('body').html(number_of_common) 
1

Nicht nur zwei Arrays aber für eine Kreuzung von n-Arrays ... Lassen Sie uns Array.prototype.intersect()

Array.prototype.intersect = function(...a) { 
 
    return [this,...a].reduce((p,c) => p.filter(e => c.includes(e))); 
 
} 
 

 
var arrs = [[0,2,4,6,8],[4,5,6,7],[4,6]], 
 
    arr = [0,1,2,3,4,5,6,7,8,9]; 
 

 
console.log(JSON.stringify(arr.intersect(...arrs))); 
 

 
// or just do 
 

 
console.log(JSON.stringify(["a","b","c","d"].intersect(["b","d","f","h"])));

+0

Benötigen Sie 'JSON.stringfy'? –

+0

@Urs u s Eigentlich nein, aber es zeigt die Arrays und Objekte horizontal. – Redu