【问题标题】:array.prototype.flat is undefined in nodejsarray.prototype.flat 在 nodejs 中未定义
【发布时间】:2019-04-03 23:19:31
【问题描述】:

给出以下js命令:

[].flat;

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

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

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

好像和Array.prototype.flatMap一样。

【问题讨论】:

  • 这些是“提案”阶段 API。
  • MDN 记录了这些东西。例如,滚动到flatMap 的底部可比性表
  • 检查nodejs版本和功能表的好来源node.green

标签: javascript arrays node.js


【解决方案1】:

您需要node 11 or higher for Array.prototype.flat。 MDN 是学习 Javascript 和作为参考的绝佳资源。您将在此处找到有关使用、浏览器兼容性甚至 polyfill 的信息。

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      目前 node.js 似乎不支持它。一种扁平化(深度 1)数组的快速 ES6 方法:

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

      【讨论】:

      • 这将引发错误,其中数组的元素不是数组。示例:[2, 3, [1, 2]][2, 3]。除此之外,如果元素是Strings,它也会产生不理想的结果。使用它来在 ES6 中将数组展平到 1 级:[[1, 2], [3, 4], 2].reduce((flattened, element) => flattened.concat(element), []);
      【解决方案4】:

      要构建 Daphoque 的答案(我相信它相当于 flat(Infinity)),您可以像这样执行完整的 polyfill。

      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 的命名不佳的 Jasmine 测试:

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

      我很惊讶我没有找到像 they have for, eg, map 这样的 flat on MDN 的 polyfill,但这个似乎确实通过了那里的示例。

      如果我错过了一个案例,请告诉我。

      【讨论】:

        猜你喜欢
        • 2021-04-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-07-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多