.flat() ist keine Funktion, was ist falsch?

Lesezeit: 3 Minuten

Benutzer-Avatar
TechnoRitter

Der folgende Code

function steamrollArray(arr) {
  // I'm a steamroller, baby
  return arr.flat();
}

steamrollArray([1, [2], [3, [[4]]]]);

kehrt zurück

arr.flat ist keine Funktion

Ich habe es einprobiert Feuerfuchs und Chrom v67 und das gleiche Ergebnis ist eingetreten.

Was ist los?

  • Es ist Experimental-. Welchen Browser verwendest du?

    – Phix

    22. Juni 2018 um 18:09 Uhr

  • Welcher Browser? Hast du dir die angeschaut Verfügbarkeitstabelle?

    – null298

    22. Juni 2018 um 18:09 Uhr

  • Ja, ich habe es gesehen und ich habe es in Firefox versucht, als es nicht funktionierte, habe ich es erneut mit Chrome versucht (das unterstützt wird, letzte Version) und das gleiche Ergebnis ist aufgetreten.

    – TechnoRitter

    22. Juni 2018 um 18:11 Uhr


  • Welche Chrome-Version verwendest du?

    – chuckx

    22. Juni 2018 um 18:11 Uhr

  • @TechnoKnight Chrome 69+ wird unterstützt. Welche Chrome-Version hast du?

    Benutzer47589

    22. Juni 2018 um 18:12 Uhr


Benutzer-Avatar
Iwan

Das flat Methode ist noch nicht implementiert in gängigen Browsern (nur Chrome v69, Firefox Nightly und Opera 56). Es ist eine experimentelle Funktion. Daher können Sie es nicht verwenden noch.

Vielleicht möchten Sie Ihre eigenen haben flat Funktion stattdessen:

Object.defineProperty(Array.prototype, 'flat', {
    value: function(depth = 1) {
      return this.reduce(function (flat, toFlatten) {
        return flat.concat((Array.isArray(toFlatten) && (depth>1)) ? toFlatten.flat(depth-1) : toFlatten);
      }, []);
    }
});

console.log(
  [1, [2], [3, [[4]]]].flat(2)
);

Der Code wurde hier von Noah Freitas ursprünglich implementiert, um das Array mit no zu glätten depth spezifizierten.

  • Das wäre gleichbedeutend mit arr.flat(Infinity)aber nicht mit dem Standardargument von 1

    – Patrick Roberts

    22. Juni 2018 um 18:16 Uhr

  • @Iwan flat verwendet ein Argument, das die Abflachungstiefe definiert. Diese Füllwatte nicht.

    – Sebastian Simon

    22. Juni 2018 um 18:21 Uhr

  • Vielleicht möchten Sie die Tiefe-1 nicht als Bedingung verwenden, wenn Sie 0 eingeben, wird das zu -1, was gleich wahr und nicht falsch ist.

    – WORMSS

    3. April 2019 um 7:07 Uhr

  • @RotimiBest Das ist komisch. Ich habe es überprüft und es funktioniert auf Chrome v74. Kannst du versuchen zu tippen Array.prototype.flat in deiner Konsole?

    – Iwan

    10. Mai 2019 um 11:13 Uhr


  • September 2020, noch ein Thema :/

    – Ambroise Rabier

    12. September 2020 um 9:36 Uhr

Das kann auch funktionieren.

let arr = [ [1,2,3], [2,3,4] ];
console.log([].concat(...arr))

Oder für ältere Browser,

[].concat.apply([], arr);

  • Sehr einfach, funktionierte für mich für einen Test auf Leetcode, da array.flat() in JS nicht unterstützt wurde

    – Cherucole

    11. Mai 2020 um 6:18 Uhr

Benutzer-Avatar
resu

Array.flat ist nicht unterstützt durch Ihren Browser. Im Folgenden finden Sie zwei Möglichkeiten, dies zu implementieren.

Als Funktion, die depth Variable gibt an, wie tief die input Die Array-Struktur sollte abgeflacht werden (standardmäßig 1; use Infinity so tief gehen wie es geht) während die stack ist das abgeflachte Array, das bei rekursiven Aufrufen als Referenz übergeben und schließlich zurückgegeben wird.

function flat(input, depth = 1, stack = [])
{
    for (let item of input)
    {
        if (item instanceof Array && depth > 0)
        {
            flat(item, depth - 1, stack);
        }
        else {
            stack.push(item);
        }
    }
    
    return stack;
}

Als Polyfill, verlängernd Array.prototype wenn Sie das bevorzugen arr.flat() Syntax:

if (!Array.prototype.flat)
{
    Object.defineProperty(Array.prototype, 'flat',
    {
        value: function(depth = 1, stack = [])
        {
            for (let item of this)
            {
                if (item instanceof Array && depth > 0)
                {
                    item.flat(depth - 1, stack);
                }
                else {
                    stack.push(item);
                }
            }
            
            return stack;
        }
    });
}

  • Keine Ahnung, warum Flat in meinem Node v12 nicht funktioniert, trotzdem danke für Flat Func, kopiere und bekomme, was ich brauche <3

    – Jegor Zaremba

    8. März 2020 um 18:45 Uhr

Ähnliches Problem, gelöst mit der Methode ES6 .reduce():

const flatArr = result.reduce((acc, curr) => acc.concat(curr),[]);

benutze _.flatten aus dem Lodash-Paket 😉

Benutzer-Avatar
AntiRakPro

var arr=[[1,2],[3,4],[5,6]];
var result=[].concat(...arr);
console.log(result);    //output: [ 1, 2, 3, 4, 5, 6 ]

Benutzer-Avatar
Mo.

Eine andere einfache Lösung ist _.flattenDeep() an Lodash

https://lodash.com/docs/4.17.15#flattenDepth

const flatArrays = _.flattenDeep([1, [2], [3, [[4]]]]);

console.log(flatArrays);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.21/lodash.min.js"></script>

1106190cookie-check.flat() ist keine Funktion, was ist falsch?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy