web-dev-qa-db-fra.com

array.Push n'est pas une fonction - lorsque vous travaillez avec réduire

Quelqu'un peut-il m'aider à comprendre ce qui se passe ici?

let firstArray = [];
firstArray.Push(1);
firstArray.Push(1);
firstArray.Push(1);
console.log("firstArray", firstArray); // result [ 1, 1, 1 ] - as expected.



let secondArray = [1, 2, 3].reduce((acc, item) => {

    console.log("acc", acc);
    console.log("typeof acc", typeof acc);

    // on first passing, the accumulator (acc) is Array[] == object.
    // on the second passing the acc == number.

    // but why?
    /// i expect to get [1,1,1] as my secondArray.
    return acc.Push(1);

}, []);

console.log("secondArray", secondArray); 

le programme plante avec "acc.Push n'est pas une fonction"

accumulator.Push is not a function in reduce

Et inspecter le premier accumulator enregistré montre que nous avons la méthode Push - c'est une vraie fonction:

array.Push not working with reduce

19
AIon

La valeur de retour de Array#Push est la nouvelle longueur du tableau après le Push. Cela signifie que dans la deuxième itération acc est un nombre, qui n'a pas la méthode Push.

La solution est simple - séparez les instructions Push et return:

const secondArray = [1, 2, 3].reduce((acc, item) => {
    acc.Push(1);

    return acc;
}, []);

console.log(secondArray);
30
Ori Drori