Ronja Räuberstochter: reduce() ist heute sehr eigensinnig!

Hallo,

ich kämpfe gerade ein wenig mit der reduce-Methode...

...und zwar will ich den Index eines Objekts innerhalb eines Arrays herausfinden, wo ein key eine bestimmte value hat. Das wollte ich so lösen:

var arr = [{key1: 12, key2: 21, key3: 31}, {key1: 11, key2: 12, key3: 13}];

var ObjektIndex_finden = arr.reduce(function(acc, curr){
	if (curr.key2 === 21) {
		acc = arr.indexOf(curr);
	}
	return acc;
});


console.log(ObjektIndex_finden);

Resultat ist einfach das Objekt, nicht wie man (eher: ich) erwarten würde: 0 (die Position des Objekts im Array) Was mache ich falsch und wie mach ich's richtig?

Danke für eure Hilfe!

  1. Hallo

    var arr = [{key1: 12, key2: 21, key3: 31}, {key1: 11, key2: 12, key3: 13}];
    
    var ObjektIndex_finden = arr.reduce(function(acc, curr){
    	if (curr.key2 === 21) {
    		acc = arr.indexOf(curr);
    	}
    	return acc;
    });
    
    
    console.log(ObjektIndex_finden);
    

    Wenn du der Methode reduce nicht als drittes Argument einen Anfangswert für den Akkumulator übergibst, dann wird beim ersten Aufruf der Rückruffunktion standardmäßig das erste Element des Arrays verwendet. Deswegen bekommst du hier am Ende das erste Objekt in dem Array als Ergebnis. Du reichst es einfach durch.

    Eigentlich willst du aber auch gar nicht reduce verwenden, sondern findIndex:

    const array = [
        {key1: 12, key2: 21, key3: 31},
        {key1: 11, key2: 12, key3: 13}
    ];
    
    array.findIndex(object => object.key2 === 21); // 0
    

    Viele Grüße,

    Orlok

    1. Hallo,

      danke für die Alternative.

      Aber was stimmt denn nun mit meiner Denke nicht?

      Wenn ich der Methode einen Ausgangswert von 0 hinzufüge, ist das Resultat undefined

      var arr = [{key1: 12, key2: 21, key3: 31}, {key1: 11, key2: 12, key3: 13}];
      
      var ObjektIndex_finden = arr.reduce(function(acc, curr){
      	if (curr.key2 === 21) {
      		acc = arr.indexOf(curr);
      		return acc;
      	}	
      }, 0);
      
      
      console.log(ObjektIndex_finden);
      

      Was stimmt nicht?

      Danke!

      1. Hallo

        Wenn ich der Methode einen Ausgangswert von 0 hinzufüge, ist das Resultat undefined

        Aber nicht deswegen.

        var arr = [{key1: 12, key2: 21, key3: 31}, {key1: 11, key2: 12, key3: 13}];
        
        var ObjektIndex_finden = arr.reduce(function(acc, curr){
        	if (curr.key2 === 21) {
        		acc = arr.indexOf(curr);
        		return acc;
        	}	
        }, 0);
        
        
        console.log(ObjektIndex_finden);
        

        Schau mal genau hin, wo du dein return‐Statement notiert hast.

        Wenn die Bedingung nicht wahr ist, gibt dein Reducer implizit den Wert undefined zurück. Du willst aber immer den akkumulierten Wert zurückgeben, wobei in dem Fall, dass die Bedingung wahr ist, der Wert angepasst wird.

        var ObjektIndex_finden = arr.reduce(function(acc, curr, index){
        	if (curr.key2 === 21) {
        		acc = index;
        	}	
        	return acc;
        }, 0);
        

        Wenn du es so schreibst, wird dir der richtige Index ausgegeben. Den du übrigens nicht mit der Methode indexOf ermitteln musst. Der Index wird als drittes Argument an deine Rückruffunktion übergeben.

        Viele Grüße,

        Orlok

        1. Auch wieder wahr, danke!