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

IT技术 javascript arrays node.js object cross-browser
2021-02-22 03:34:18

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

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

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

6个回答

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

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

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

(psst,mdn 虽然很棒,但不是“官方”文档 - tc39.github.io/ecma262/#sec-object.values
2021-04-19 03:34:18
无论如何,对象键都是无序的,因此数组顺序应该无关紧要。
2021-04-26 03:34:18
IE 11 是唯一不支持Object.values(). 今天早上刚咬了我们。我们在 Chrome 上测试过,但没有在 IE 上测试过。谢谢@tymeJV,提供了很好的答案和示例。
2021-04-27 03:34:18
奇怪的。.values看起来很强大。谢谢你给我展示了一个替代方案。现在更有意义了!
2021-05-11 03:34:18
这里没有提到的是 Object.keys 确实像使用随机键排序的对象那样在数组中重新排列返回的数组,因此返回值可能与原始对象中的顺序不同。var anObj = { 100: 'a', 2: 'b', 7: 'c' }; console.log(Object.keys(anObj)); // 控制台: ['2', '7', '100']
2021-05-11 03:34:18

还值得注意的是,只有 Node 版本 >= 7.0.0 完全支持这一点。

http://node.green

遇到了这个正在运行的笑话测试,我以为我在节点 v8 上,但结果我在节点 v6 上。检查您的节点版本!节点 -v
2021-05-14 03:34:18
node -v 检查版本然后升级:stackoverflow.com/a/53658468/5813940
2021-05-15 03:34:18

对于那些最终来到这里并使用 Angular 的人来说,添加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

使用在 mozilla 中讨论的“for...in”:https : //developer.mozilla.org/en-US/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'

看起来这个问题已在 Safari 最新版本中修复。我遇到了同样的问题。此问题在浏览器版本 9.0.1 中出现,在 10.1.1 中不会出现

编辑以添加附件:

[snippet][1]
[object value][2]
[browser version][3]
您有可以分享此信息的参考资料吗?错误报告之类的?
2021-04-26 03:34:18
我没有参考。带有 9.0x 版本的 mac 系统一直导致该问题。但是我的系统携带 10.1.1 不会导致同样的问题。
2021-05-01 03:34:18