Array.prototype.flat не определен в nodejs

Дана следующая команда js:

[].flat;

Запуск в браузере (chrome / firefox): возвращает function

Выполнение его с помощью nodejs v10.13.0: возвращает undefined

Теперь мне интересно, каких других методов нет в узле RTE и где находится документация по глобальным объектам, таким как Array.

Вроде бы то же самое с Array.prototype.flatMap.

Это API стадии "предложения".

Pointy 30.10.2018 21:28

MDN документирует это. Например, прокрутите до нижней таблицы сопоставимости для flatMap

Mark 30.10.2018 21:30

Отличный источник для проверки версий nodejs и таблицы функций узел. зеленый

Rashad Ibrahimov 30.10.2018 21:38
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
29
3
12 867
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

Вам понадобится узел 11 или выше для Array.prototype.flat. MDN - отличный ресурс как для изучения Javascript, так и в качестве справочного материала. Там вы найдете информацию об использовании, совместимости с браузерами и даже полифилах.

Что касается поддержки ES6 + в Node.js, лучшим ресурсом является узел. зеленый с очень подробным и актуальным списком поддерживаемых функций в зависимости от версии узла.

Еще не определено в node js, но вы можете легко его переписать

function flatten(array)
{
    if (array.length == 0)
        return array;
    else if (Array.isArray(array[0]))
        return flatten(array[0]).concat(flatten(array.slice(1)));
    else
        return [array[0]].concat(flatten(array.slice(1)));
}

console.info(flatten([1, 3, [4, 8, 8], [[6],[3,5,[9,9]]]]))

Похоже, что на данный момент это не поддерживается в node.js. Быстрый способ ES6 сглаживания (глубина 1) массива:

[[1, 2], [3, 4]].reduce((acc, val) => [ ...acc, ...val ], [])

Это вызовет ошибку с массивами, элементы которых не являются массивами. Примеры: [2, 3, [1, 2]], [2, 3]. В дополнение к этому, это также даст нежелательные результаты, если элементы являются Strings. Используйте это вместо того, чтобы сгладить массивы до 1 уровня в ES6: [[1, 2], [3, 4], 2].reduce((flattened, element) => flattened.concat(element), []);

Leonardo Kuffo 14.05.2020 09:08

Чтобы основываться на ответе Дафока (который, я полагаю, эквивалентен flat(Infinity)), вы можете сделать полный полифилл, подобный этому.

if (!Array.prototype.flat) {
    Array.prototype.flat = function (maxDepth, currentDepth) {
        "use strict";
        var array = this;
        maxDepth = maxDepth === Infinity
            ? Number.MAX_SAFE_INTEGER
            : parseInt(maxDepth, 10) || 1;
        currentDepth = parseInt(currentDepth, 10) || 0;

        // It's not an array or it's an empty array, return the object.
        if (!Array.isArray(array) || !array.length) {
            return array;
        }

        // If the first element is itself an array and we're not at maxDepth, 
        // flatten it with a recursive call first.
        // If the first element is not an array, an array with just that element IS the 
        // flattened representation.
        // **Edge case**: If the first element is an empty element/an "array hole", skip it.
        // (see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/flat#Examples)
        var firstElemFlattened = (Array.isArray(array[0]) && currentDepth < maxDepth)
            ? array[0].flat(maxDepth, currentDepth + 1)
            : array[0] === undefined ? [] : [array[0]];

        return firstElemFlattened.concat(array.slice(1).flat(maxDepth, currentDepth));
    };
}

А вот несколько неудачно названных тестов Jasmine на основе примеры на странице MDN:

// MDN examples:
// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/flat#Examples
describe('testing flatmap against mdn examples', function () {
  "use strict";

  // loadFolders,
  it('works 1', function () {
    var arr1 = [1, 2, [3, 4]];
    var out = arr1.flat();
    expect(out).toEqual([1, 2, 3, 4]);
  });

  it('works 2', function () {
    var arr2 = [1, 2, [3, 4, [5, 6]]];
    var out2 = arr2.flat();
    expect(out2).toEqual([1, 2, 3, 4, [5, 6]]);
  });

  it('works 3', function () {
    var arr3 = [1, 2, [3, 4, [5, 6]]];
    var out3 = arr3.flat(2);
    expect(out3).toEqual([1, 2, 3, 4, 5, 6]);
  });

  it('works 4', function () {
    var arr4 = [1, 2, [3, 4, [5, 6, [7, 8, [9, 10]]]]];
    var out4 = arr4.flat(Infinity);
    expect(out4).toEqual([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);
  });

  it('works 5', function () {
    var arr5 = [1, 2, , 4, 5];
    var out5 = arr5.flat();
    expect(out5).toEqual([1, 2, 4, 5]);
  });

  it('works 6', function () {
    var arr6 = [1, 2, , 4, [5, 6]];
    var out6 = arr6.flat();
    expect(out6).toEqual([1, 2, 4, 5, 6]);
  });
});

Я удивлен, что я не нашел полифилла для flat на MDN, такого как у них есть, например, для map, но этот, похоже, проходит там примеры.

Сообщите мне, если я пропустил дело.

Другие вопросы по теме