.flat() не является функцией, что неправильно? - программирование
Подтвердить что ты не робот

.flat() не является функцией, что неправильно?

Следующий код

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

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

возвращается

arr.flat не является функцией

Я попробовал его в Firefox и Chrome v67, и тот же результат произошел.

Что не так?

4b9b3361

Ответ 1

Метод flat еще не реализован в обычных браузерах (только Chrome v69, Firefox Nightly и Opera 56). Это экспериментальная особенность. Поэтому вы пока не можете его использовать.

Возможно, вы захотите использовать собственную функцию flat:

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)
);

Ответ 2

Array.flat не поддерживается в вашем браузере. Ниже приведены два способа его реализации.

Как функция: переменная depth указывает, насколько глубоко структура массива input должна быть сглажена (по умолчанию 1; используйте Infinity, чтобы пройти как можно глубже), в то время как stack является сглаженным массивом, переданным ссылка на рекурсивные вызовы.

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;
}

Polyfill, расширение Array.prototype:

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;
        }
    });
}

Ответ 3

Не уверен, что это правильный ответ, однако при попытке выровнять массив я использовал destructuring_assignment, представленный в ES6.

// typeScriptArray:Array<Object> = new Array<Object>();
let concatArray = [];

let firstArray = [1,2,3];
let secondArray = [2,3,4];

concatArray.push(...firstArray);
concatArray.push(...secondArray);

console.log(concatArray);