reduce() ist heute sehr eigensinnig!
Ronja Räuberstochter
- javascript
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!
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
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!
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
Auch wieder wahr, danke!