Object.values()的替代版本

use*_*330 55 javascript browser internet-explorer ecmascript-6

我正在寻找该Object.values()功能的替代版本.
如此处所述,Internet Explorer不支持该功能.

执行以下示例代码时:

var obj = { foo: 'bar', baz: 42 };
console.log(Object.values(obj)); // ['bar', 42]
Run Code Online (Sandbox Code Playgroud)

它适用于Firefox和Chrome,但在IE11中引发以下错误:

对象不支持属性或方法"值"

在这里你可以测试它:小提琴.

那么,什么是快速修复?

Nen*_*car 138

您可以获取键数组,Object.keys()然后使用它map()来获取值.

var obj = { foo: 'bar', baz: 42 };
var values = Object.keys(obj).map(function(e) {
  return obj[e]
})

console.log(values)
Run Code Online (Sandbox Code Playgroud)

使用ES6,您可以使用箭头功能将其写入一行.

var values = Object.keys(obj).map(e => obj[e])
Run Code Online (Sandbox Code Playgroud)

  • 谢谢!对于我的5号代码,我将`objectValues = Object.values;`更改为`objectValues =((obj)=> {return Object.keys(obj).map(e => obj [e]);});` (2认同)

Cho*_*ang 15

Object.values()是ES8(2017年6月)规范的一部分.使用Cordova,我意识到Android 5.0 Webview不支持它.所以,我做了以下操作,只有在不支持该功能时才创建polyfill函数:

if (!Object.values) Object.values = o=>Object.keys(o).map(k=>o[k]);
Run Code Online (Sandbox Code Playgroud)


Jor*_*lez 12

由于Object是一个(不是那么)最近的实现,如果你想支持所有浏览器(AKA IE8及以下版本),那么你需要创建自己的函数:

function objectValues(obj) {
    var res = [];
    for (var i in obj) {
        if (obj.hasOwnProperty(i)) {
            res.push(obj[i]);
        }
    }
    return res;
}
Run Code Online (Sandbox Code Playgroud)

PS:刚注意到ecmascript-6标签.顺便说一句,我在这里保留这个答案,以防有人需要它.


Dan*_*cht 9

如果您已经在使用core-js(例如通过使用 Angular),您只需导入相应的 polyfill:

   import 'core-js/es7/object';
Run Code Online (Sandbox Code Playgroud)


小智 6

您可以使用polyfill:

const valuesPolyfill = function values (object) {
  return Object.keys(object).map(key => object[key]);
};

const values = Object.values || valuesPolyfill;

console.log(values({ a: 1, b: 2, c: 3 }));
Run Code Online (Sandbox Code Playgroud)