未捕获的TypeError:Object.values不是JavaScript函数


80

我有一个简单的对象,如下所示:

var countries = {
    "Argentina":1,
    "Canada":2,
    "Egypt":1,
};

我需要创建两个数组。第一个数组是对象中所有键的数组。我通过以下方式创建了此数组:

var labels = Object.keys(countries);

这很好。我得到了一些国家。现在,当我尝试从值创建数组时...

var labels = Object.values(countries);

我收到此错误: Uncaught TypeError: Object.values is not a function JavaScript

我不知道我在做什么错。我console.log countries在声明前后labels对象和对象保持不变。如何正确使用Object.values()


您使用的是哪种浏览器,因为根据MDN的支持
Mark C.

@MarkC。我正在使用Google Chrome 52.0.2743.82
Alex Fallenstedt

Answers:


224

.values在许多浏览器中不受支持-您可以.map用来获取所有值的数组:

var vals = Object.keys(countries).map(function(key) {
    return countries[key];
});

请参见MDN文档:https//developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/values或官方文档:https//tc39.github.io/ecma262/#sec- object.values(感谢@evolutionxbox进行更正)


2
奇怪。.values似乎很强大。感谢您向我展示其他方法。现在,它变得更有意义了!
Alex Fallenstedt

1
(嘘,MDN同时又是令人称奇的是不是“官方”文件- tc39.github.io/ecma262/#sec-object.values
evolutionxbox

这里没有提到的是Object.keys确实按照随机键顺序将返回的数组重新排列成类似对象的数组,因此返回值可能与原始对象的顺序不同。var anObj = {100:'a',2:'b',7:'c'}; console.log(Object.keys(anObj)); //控制台:['2','7','100']
user1502826

2
无论如何,对象键都是无序的,因此数组的顺序无关紧要。
tymeJV

IE 11是唯一不支持的现代浏览器Object.values()。今天早上刚咬我们。我们已经在Chrome上进行了测试,但未在IE上进行过测试。感谢@tymeJV提供了出色的答案和示例。
亚历克斯


16

对于那些谁在这里结束了,并采用了棱角分明,添加import 'core-js/es7/object';polyfills.ts文件解决了这个问题对我来说。

/** IE9, IE10 and IE11 requires all of the following polyfills. **/
import 'core-js/es6/array';
import 'core-js/es6/date';
import 'core-js/es6/function';
import 'core-js/es6/map';
import 'core-js/es6/math';
import 'core-js/es6/number';
import 'core-js/es6/object';
import 'core-js/es6/parse-float';
import 'core-js/es6/parse-int';
import 'core-js/es6/regexp';
import 'core-js/es6/set';
import 'core-js/es6/string';
import 'core-js/es6/symbol';
import 'core-js/es6/weak-map';
import 'core-js/es7/array';
import 'core-js/es7/object'; // added import

2

看起来此问题已在Safari最新版本中修复。我遇到了同样的问题。此问题在浏览器版本9.0.1中发生,而在10.1.1中不发生

编辑以添加附件:

[snippet][1]
[object value][2]
[browser version][3]

1
您是否可以共享此信息的参考?错误报告或其他内容?
Tim Hutchison

我没有参考。搭载9.0x版本的mac系统持续造成此问题。但是我的系统携带10.1.1不会导致相同的问题。
Venkata

2

如mozilla所讨论的那样使用“ for ... in”:https : //developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_objects/Object/values

这是我使用的代码:

function objectValues(obj) {
    let vals = [];
    for (const prop in obj) {
        vals.push(obj[prop]);
    }
    return vals;
}

// usage
let obj = {k1: 'v1', k2: 'v1', k3: 'v1'};

console.log(objectValues(obj));             // prints   the array  [ 'v1', 'v1', 'v1' ]
// OR
console.log(objectValues(obj).join(', '));  // prints   the string 'v1, v1, v1'

0

我认为在编译支持问题上对浏览器的兼容性,可以使用map来实现。

var countries = [
  {
"Argentina": 1,
"Canada": 2,
"Egypt": 1,
"india": 1
  },
  {
"Argentina": 1,
"india": 1,
"US": 2,
"UK": 1,

  }
];

var unpick = countries.map(d=>{ return Object.keys(d) });
console.log(unpick)

var countries = [
  {
"Argentina": 1,
"Canada": 2,
"Egypt": 1,
"india": 1
  },
  {
"Argentina": 1,
"india": 1,
"US": 2,
"UK": 1,

  }
];

var unpick = countries.map(d=>{ return Object.values(d) });
console.log(unpick)


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.