在nodejs中未定义array.prototype.flat

时间:2018-10-30 20:26:18

标签: javascript arrays node.js

给出以下js命令:

[].flat;

在浏览器(chrome / firefox)中执行:返回function

使用nodejs v10.13.0执行:返回undefined

现在,我想知道节点RTE中还没有其他什么方法,像Array这样的全局对象的文档在哪里。

似乎与Array.prototype.flatMap相同。

3 个答案:

答案 0 :(得分:9)

您可以找到documentation for Array in MDN。 MDN是学习Javascript和参考的绝佳资源。您可以在此处找到有关用法,浏览器兼容性甚至是polyfill的信息。

在那里您可以看到flat is experimental an not supported in some browsers

enter image description here

对于Node.js对ES6 +的支持,最好的资源是node.green,其中包含按节点版本列出的非常详细和最新的受支持功能列表。

enter image description here

答案 1 :(得分:2)

尚未在节点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.log(flatten([1, 3, [4, 8, 8], [[6],[3,5,[9,9]]]]))

答案 2 :(得分:1)

要基于Daphoque的答案(我相信,它相当于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));
    };
}

这是基于examples on the MDN page的一些名字不佳的茉莉花测试:

// 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 on MDN这样的they have for, eg, map的polyfill,但是这个似乎确实通过了例子。

让我知道我是否错过了案件。