Babel 对 Object.entries 的支持

Posted

技术标签:

【中文标题】Babel 对 Object.entries 的支持【英文标题】:Babel support for Object.entries 【发布时间】:2016-05-07 12:29:48 【问题描述】:

我正在查看stage 3 proposal of Object.values/Object.entries,我真的很想在我当前的 javascript 项目中使用它。

但是,我不知道是否有任何 Babel 预设支持它。由于上面链接的 GitHub 存储库说这是第 3 阶段的提案,我认为它会成为 babel-preset-stage-3 的一部分,但似乎不是。

是否有任何 Babel 预设(甚至插件?)可以让我今天使用 Object.entries?

【问题讨论】:

babeljs.io/docs/usage/polyfill , github.com/zloirock/core-js#ecmascript-7-proposals @FelixKling:谢谢,但恐怕我真的不知道如何处理您链接的信息! Babel polyfill 仅使用 core-js,但我不确定哪些功能。如果你只想支持Object.entries,只需为此加载 core-js 的 polyfill。 @FelixKling:我终于知道怎么用了!请添加您的评论作为答案,我会很乐意接受它! :) 【参考方案1】:

我所做的是安装core-js,然后在我的文件顶部调用它:

require('core-js/fn/object/entries');

这使Object.entries 可用。感谢@FelixKling。

更新

在core-js@3中,导入路径发生了变化:

require('core-js/features/object/entries');

【讨论】:

【参考方案2】:

使用babel,安装

    babel-preset-env babel-plugin-transform-runtime

支持 Object.values/Object.entries 以及其他 *ES20** 功能。

根据模块的建议,配置 .babelrc 如下:


  "plugins": ["transform-runtime"],
  "presets": ["env"]

【讨论】:

我在babeljs.io/docs/plugins/preset-es2017 中没有看到对Object.entries 的支持。支持是否移至另一个预设? github.com/bettiolo/babel-preset-es2017/issues/37 似乎确认此功能不在预设范围内。 我的目标是浏览器。在这种情况下,您需要使用babeljs.io/docs/usage/polyfill。您能否更新答案以解决用户应该为节点与浏览器做些什么? babel-polyfill 目前确实支持Object.entries,当定位浏览器时,您只需在应用程序入口点(根 index.js)中包含import "babel-polyfill"; babel-preset-es2017 现已弃用,改用 babel-preset-env【参考方案3】:

更新

如 cmets 中所述,您可以通过使用 map 函数而不是 reduce 来提高性能。

请注意,代码区分大小写 (object != Object)。

// Object.values

var objectToValuesPolyfill = function(object) 
    return Object
             .keys(object)
             .map(
                  function(key) 
                    return object[key];
                  
              );


Object.values = Object.values || objectToValuesPolyfill;

// Object.entries

var objectToEntriesPolyfill = function(object) 
    return Object
             .keys(object)
             .map(
                  function(key) 
                    return [key, object[key]];
                  
              );


Object.entries = Object.entries || objectToEntriesPolyfill;

用法:

// es6

Object.values = Object.values || (x => Object.keys(x).map(k => x[k]));
Object.entries = Object.entries || (x => Object.keys(x).map(k => [k, x[k]]));

// es5

Object.values = Object.values || function(x) 
    return Object.keys(x).map(function(k) 
        return x[k];
    )
;

Object.entries = Object.values || function(x) 
    return Object.keys(x).map(function(k) 
        return [k, x[k]];
    )
;


const a = 
  key: "value",
  bool: true,
  num: 123


console.log(
  Object.values(a)
)

console.log(
  Object.entries(a)
)

【讨论】:

您实际上可以在这里使用map 而不是reduce,这有点简单:.map(key => object[key])(其中object 是您的x)。另外,我假设您在给变量一个字母名称时会追求性能而不是可读性,但由于这是一个教育答案,我建议使用逻辑名称并添加关于缩短它们以提高性能的评论。【参考方案4】:

我在 2020 年底找到的另一种替代解决方案,适用于 IE11。

npm install --save-dev babel-plugin-transform-es2017-object-entries

然后添加到package.json中

"babel": 
    "plugins": [
        "transform-es2017-object-entries"
    ]

【讨论】:

以上是关于Babel 对 Object.entries 的支持的主要内容,如果未能解决你的问题,请参考以下文章

Object构造函数的方法 之Object.entries()

Object.entries() 数组变对象

React.js 迭代对象而不是 Object.entries 的正确方法

如何在 Typescript 中输入 Object.entries() 和 Object.fromEntries?

Object.keys(),Object.values(),Object.entries()

Object.entries()但是对象而不是数组