【问题标题】:Uncaught TypeError: Object.values is not a function JavaScript未捕获的 TypeError:Object.values 不是 JavaScript 函数
【发布时间】:2016-12-09 11:04:37
【问题描述】:

我有一个像下面这样的简单对象:

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

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

【问题讨论】:

  • 您使用的是什么浏览器,因为根据 MDN,它不可能是 supported
  • @MarkC。我正在使用谷歌浏览器 52.0.2743.82

标签: javascript arrays node.js object cross-browser


【解决方案1】:

.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 的更正)

【讨论】:

  • 奇怪。 .values 似乎很强大。感谢您向我展示了另一种选择。现在更有意义了!
  • (psst,mdn 虽然令人惊叹但不是“官方”文档 - tc39.github.io/ecma262/#sec-object.values
  • 这里没有提到的是 Object.keys 确实在数组中重新排列返回的数组,比如具有随机键顺序的对象,因此返回值的顺序可能与原始对象中的顺序不同。 var anObj = { 100: 'a', 2: 'b', 7: 'c' }; console.log(Object.keys(anObj)); // 控制台:['2', '7', '100']
  • 对象键无论如何都是无序的,所以数组顺序应该无关紧要。
  • IE 11 是唯一不支持Object.values() 的现代浏览器。今天早上刚咬我们。我们在 Chrome 上测试过,但没有在 IE 上测试过。谢谢@tymeJV,提供了很好的答案和示例。
【解决方案2】:

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

编辑以添加附件:

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

【讨论】:

  • 您是否有可以分享此信息的参考资料?错误报告之类的?
  • 我没有参考资料。带有 9.0x 版本的 mac 系统一直在导致该问题。但我的系统携带 10.1.1 不会导致同样的问题。
【解决方案3】:

使用 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'

【讨论】:

    【解决方案4】:

    我认为编译支持对浏览器兼容性的问题,您可以使用 ma​​p 来实现。

    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)

    【讨论】:

      【解决方案5】:

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

      http://node.green

      【讨论】:

      • 遇到了这个正在运行的笑话测试,我以为我在节点 v8 上,但结果我在节点 v6 上。检查您的节点版本!节点-v
      • node -v 检查版本然后升级:stackoverflow.com/a/53658468/5813940
      【解决方案6】:

      对于那些最终来到这里并使用 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
      

      【讨论】:

        【解决方案7】:

        考虑使用_.values(object)

        文档:https://lodash.com/docs/4.17.11#values

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-05-16
          • 1970-01-01
          • 2022-06-26
          • 1970-01-01
          • 2020-07-04
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多