Object.values()的替代版本


78

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

执行以下示例代码时:

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

它在Firefox和Chrome中都可以使用,但是在IE11中引发以下错误:

对象不支持属性或方法的“值”

在这里您可以对其进行测试:Fiddle

那么,什么是快速解决方案?

Answers:


177

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

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

console.log(values)

使用ES6,您可以使用箭头功能将其编写为一行。

var values = Object.keys(obj).map(e => obj[e])

2
谢谢!对于我的角5的代码,我改变了objectValues = Object.values;objectValues = ((obj) => { return Object.keys(obj).map(e => obj[e]); });
杰夫·

@Jeff为什么不看看有角的多边形填充物?
萨克斯姆(Saksham)

angular8 polyfill.ts:import 'core-js/es/object/values';
wutzebaer

21

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

if (!Object.values) Object.values = o=>Object.keys(o).map(k=>o[k]);

15

由于Object是(不是这样)最近的实现,因此,如果要支持所有浏览器(AKA IE8和更低版本),则需要创建自己的函数:

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

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



7

您可以使用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 }));


4

对于使用UnderscoreJS的人,您可以使用_.values以下方法获取对象值:

var obj = { foo: 'bar', baz: 42 };
console.log(_.values(obj)); // ['bar', 42]

1

var x = {Name: 'John', Age: 30, City: 'Bangalore'};
 
Object.prototype.values = function(obj) {
                                var res = [];
    for (var i in obj) {
        if (obj.hasOwnProperty(i)) {
            res.push(obj[i]);
        }
    }
    return res;
};
 
document.getElementById("tag").innerHTML = Object.values(x)
<p id="tag"></p>


2
这不是原型方法。
Bergi

0

我知道这是一个老话题。我在玩arround,只想添加另一个实现。它只是地图版本,其中地图本身通过reduce实现:

let obj = { foo: 'bar', baz: 42 };

const valueArray = Object.keys(obj).reduce((acc, key) => {
  acc.push(obj[key]);
  return acc;
}, []);

console.log(valueArray);

它确实可以完成工作,但是它让我有些困扰。reducer函数使用obj,但没有obj注入其中。我们应该避免在函数内部使用全局变量,并使我们的函数更具可测试性。因此,我确实更喜欢使用带有reducer函数助手的版本,该助手将obj作为参数并返回实际的reducer函数。它成为了:

let obj = { foo: 'bar', baz: 42 };

// reducer function helper take obj and return the actual reducer function
let reducerFuncHelper= obj => (acc, key) => {
  acc.push(obj[key]);
  return acc;
}
//much better
const valueArray = Object.keys(obj).reduce(reducerFuncHelper(obj), []);
console.log(valueArray);


0

最好的方法是将其替换为ramda的values方法:

import * as R from 'ramda';

const obj = { foo: 'bar', test: 10 };

console.log(R.values(obj)) // ['bar', 10]


-1

由于找不到我需要的答案:

var obj = { foo: 'bar', baz: 42 };


console.log(obj[Object.keys(obj)[0]]) // bar

console.log(obj[Object.keys(obj)[1]])  // 42

利用对象的可能性按照文字来处理它们。


我的朋友没有答案
Fluidguid

@fluidguid:感谢您的评论,这是我的第一个答案,我必须学习。为什么?我以为问题是要在IE中获取对象的值。因此,有了一个简单的“ for”,我就有了。怎么了?
Frank34

-1

您可以使用Object.keys()获得键数组。这也将在IE中工作。完全不需要Object.values()来获取值,因为我们可以使用从Object.keys()获得的键来获取值,如下所示:

var obj = { foo: 'bar', baz: 42 };
var keyArray = Object.keys(obj);
for(var i = 0; i < keyArray.length; i++)
    console.log(obj[keyArray[i]]); 

1
您真的相信这是对Object.values的良好解决方案吗?
boatcoder
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.