2017-01-03 3 views
2

Wichtige Bearbeitung: Ich kann filter nicht verwenden - der Zweck ist pädagogisch.Map-Reduce: Wie man in einer Sammlung zählt

Ich habe ein Array, in dem ich die Anzahl seiner Elemente zählen würde, die eine boolean überprüfen, nur map und reduce verwenden.

Graf von der Größe des Arrays

Ich schrieb schon etwas, das die Größe des Arrays zählt (dh. Die Anzahl der alle ihrer Elemente), mit reduce:

const array_numbers = [12, 15, 1, 1]; // Size : 4 
console.log(
       array_numbers.reduce((acc) => { 
       return acc + 1; 
       }, 0) 
); 

Graf von der Array-Elemente überprüfen eine boolesche Bedingung

Jetzt möchte ich nur die Elemente zählen, die eine boolesche Bedingung überprüfen. Daher muss ich map vor reduce verwenden und die Elemente des map zurückgegebenen Array werden nur die guten Elemente sein.

Also schrieb ich diesen Code, aber es funktioniert nicht ... der Tat, ich null setzen, wenn ich ein nicht-gut-Element begegnen (und null als en Element gezählt wird leider).

Hinweis: Hier ist die boolesche Bedingung "ist das Element gerade? (% 2 == 0)".

const array_numbers = [12, 15, 1, 1]; // Size : 4 
console.log(
       array_numbers.map((current_value) => { 
       if(current_value % 2 == 0) { 
        return current_value; 
       } 
       return null; 

       }).reduce((acc) => { 
       return acc + 1; 

       }, 0) 
); 
+0

Sie für 'filter' suchen .... –

+0

ich weiß, aber Ich muss diese Funktion neu erstellen - es ist in der Tat pädagogisch. –

+0

Siehe meine Antwort dann. –

Antwort

3

Array#filter das Array und überprüfen die Länge:

const array_numbers = [12, 15, 1, 1]; 
 
const result = array_numbers.filter((n) => n % 2 === 0).length; 
 

 
console.log(result);

oder Zählung unter Verwendung von Array#reduce:

const array_numbers = [12, 15, 1, 1, 4]; 
 
const result = array_numbers.reduce((r, n) => n % 2 ? r : r + 1, 0); 
 

 
console.log(result);

Oder wenn Sie müssen Sie Array#map mit Array#reduce verwenden:

const array_numbers = [12, 15, 1, 1, 4]; 
 
const result = array_numbers 
 
    .map((n) => n % 2 === 0 ? 1 : 0) // map to 1 or 0 according to the condition 
 
    .reduce((r, n) => r + n); // sum everything 
 

 
console.log(result);

+0

Danke, aber ich kann nicht 'filter' (pädagogische Übung) verwenden. Ich habe das OP modifiziert, um dies anzuzeigen. Sorry =/ –

+0

Ich habe eine Antwort mit reduziert hinzugefügt. –

+0

Aaah Ich dachte nicht, 'reduce' so zu benutzen, danke! –

1

Sie Array.prototype.filter können die sogar Zahlen filtern - und Sie brauchen nicht die reduce() Funktion - Sie können length des Arrays verwenden, das von der filter()-Funktion zurückgegeben wird.

Oder können Sie reduce() Methode allein verwenden, wie unten:

Siehe Demos unter:

const array_numbers = [12, 15, 1, 1]; // Size : 4 
 

 
// using filter 
 
console.log(
 
    array_numbers.filter((current_value) => { 
 
    return current_value % 2 == 0; 
 
    }).length 
 
); 
 

 
// using reduce 
 
console.log(
 
    array_numbers.reduce((prev, curr) => { 
 
    return curr % 2 == 0 ? prev + 1 : prev; 
 
    }, 0) 
 
);

+0

Danke, aber ich kann keinen Filter (pädagogische Übung) verwenden. Ich habe das OP modifiziert, um dies anzuzeigen. Sorry =/ –

+0

aktualisierte Antwort :) – kukkuz

1

Da pro Ihren Kommentar Sie must Verwendung aus irgendeinem Grund reduzieren:

arr.reduce((acc, n) => { n % 2 ? acc + n : acc }, 0); 

Die Karte ist nicht notwendig.

+0

Aaah ich dachte nicht, 'reduce' so zu verwenden, danke! –

+0

@ JarsOfJam-Scheduler wenn du zufrieden bist, bitte akzeptiere :) –

1

Wie Jared Smith erwähnt, müssen Sie map für diese Aufgabe nicht verwenden. Array.reduce() ruft das aktuelle Element als zweites Argument in der Callback-Funktion ab, mit dem Sie überprüfen können, ob es Ihre gegebene Bedingung erfüllt.

Also, noch einmal davon aus, dass Sie Muss Verwendung entweder map und/oder reduce:

const myArray = [1,2,3,4,5,6]; 
 
const condition = function(a) { 
 
    // let's say 
 
    return a %2 == 0; 
 
} 
 

 
let result = myArray.reduce((acc, val) => { 
 
    return condition(val) ? acc + 1 : acc 
 
    }, 0); 
 

 
console.log(result);