JavaScript reduziert den Wurffehler für mehr als zwei Elemente

Sep 22 2020

Ich habe dieses Array:

const arr = [
  { someProp: [{ amount: 10 }]},
  { someProp: [{ amount: 12 }]},
];

und dann reduziert dies fn:

const sum = arr.reduce((prev, curr) => prev.someProp[0].amount + curr.someProp[0].amount);

Es funktioniert, wenn das Array zwei Elemente enthält, bei drei jedoch:

Eigenschaft '0' von undefined kann nicht gelesen werden "

Antworten

2 Ifaruki Sep 22 2020 at 13:06

Eigentlich müssen Sie nur den Akku + den neuen Wert zurückgeben.

Sie möchten mit 0i denke beginnen, also müssen Sie 0als zweiten Parameter hinzufügen

const arr =
    [
      { someProp: [{ amount: 10 }]},
      { someProp: [{ amount: 12 }]},
      { someProp: [{ amount: 12 }]},
    ];
    
const sum = arr.reduce((acc, item) => item.someProp[0].amount + acc, 0);

console.log(sum);

Wenn Sie es hier mit Destrukturierung würziger wollen

const arr =
    [
      { someProp: [{ amount: 10 }]},
      { someProp: [{ amount: 12 }]},
      { someProp: [{ amount: 12 }]},
    ];
    
const sum = arr.reduce((acc, { someProp: [{ amount }] }) => amount + acc, 0);

console.log(sum);

2 CristianTraìna Sep 22 2020 at 13:06

Nach der Antwort von @Pointy können Sie es auf folgende Weise mit einer beliebigen Anzahl von Elementen zum Laufen bringen:

const sum = arr.reduce((prev, curr) => prev + curr.someProp[0].amount, 0);

previst immer das zuvor zurückgegebene Element, sodass Sie es sicher als Zahl verwenden können (und da Sie es nur summieren, können Sie es 0 als Standard verwenden, sodass beim ersten reduceAufruf der Wert von prev0 ist).

2 Pointy Sep 22 2020 at 13:00

Sie geben eine Nummer zurück. Der Wert von previst immer der vorherige Rückgabewert aus dem Rückruf, nicht das vorherige Element. Bei der dritten Iteration versuchen Sie also, diese Nummer so zu verwenden, als wäre sie eine Objektreferenz.

Fügen Sie dem .reduce()Aufruf einen zweiten Parameter (0) hinzu und ändern Sie die Funktion, um sie prevals laufende Summe (eine einfache Zahl) zu behandeln:

const sum = arr.reduce((prev, curr) => prev + curr.someProp[0].amount, 0);

Es funktioniert wie es ist, wenn zwei Elemente vorhanden sind, da ohne diesen zweiten Parameter in der ersten Iteration Element 0 als prevund Element 1 als angezeigt werden curr. Dieses Verhalten funktioniert gut, wenn Sie ein Array von Zahlen haben und nur eine Berechnung zwischen ihnen durchführen möchten. In diesem Fall benötigen Sie diesen Anfangswert jedoch explizit als zweites Argument.

PeterDarmis Sep 22 2020 at 13:39

Dies ist eine alternative Lösung ... Verwenden Array.filter().

const arr = [{
    someProp: [{
      amount: 10
    }]
  },
  {
    someProp: [{
      amount: 12
    }]
  },
  {
    someProp: [{
      amount: -231
    }]
  },
  {
    someProp: [{
      amount: 21265
    }]
  },
  {
    someProp: [{
      amount: 1239
    }]
  },
  {
    someProp: [{
      amount: -6
    }]
  },
];
const sum = arr.filter((val, index) => {
  if (index > 0) {
    arr[index].someProp[0].amount = parseInt(val.someProp[0].amount) + parseInt(arr[index - 1].someProp[0].amount);
  }
  return index == arr.length - 1;
})[0].someProp[0].amount;

console.log(sum);