Uncaught TypeError:Object.valuesは関数JavaScriptではありません


80

以下のような単純なオブジェクトがあります。

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

2つの配列を作成する必要があります。最初の配列は、オブジェクトのすべてのキーの配列です。私はこの配列を次の方法で作成しました:

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。私はGoogleChrome 52.0.2743.82を使用しています
Alex Fallenstedt 2016

回答:


224

.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に感謝)


2
奇妙な。.valuesとても強力なようです。代替案を見せてくれてありがとう。今ではもっと理にかなっています!
Alex Fallenstedt 2016

1
( - PSSTは、驚くべきことながら、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 2017

2
オブジェクトキーはとにかく順序付けられていないので、配列の順序は重要ではありません。
tymeJV 2017

IE 11は、をサポートしていない唯一の最新のブラウザですObject.values()。今朝私たちを噛んでください。Chromeでテストしましたが、IEではテストしていません。素晴らしい答えと例をありがとう、@ tymeJV。
アレックス

19

7.0.0以上のノードバージョンのみがこれを完全にサポートしていることにも注意してください。

http://node.green


1
この実行中のjestテストに遭遇しました。ノードv8にいると思いましたが、ノードv6にいることがわかりました。ノードのバージョンを確認してください!ノード-v
russiansummer

:ノード-vバージョンを確認した後、アップグレードするstackoverflow.com/a/53658468/5813940
russiansummer

16

ここに行き着き、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

2

この問題はSafariの最新バージョンで修正されているようです。私は同じ問題に遭遇しました。この問題はブラウザバージョン9.0.1で発生し、10.1.1では発生しません。

添付ファイルを追加するための編集:

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

1
この情報について共有できるリファレンスはありますか?バグレポートか何か?
ティムハッチソン2017年

参考文献はありません。9.0xバージョンを搭載したMacシステムは、引き続き問題を引き起こしています。しかし、10.1.1を搭載している私のシステムでは同じ問題は発生しません。
Venkata 2017年

2

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'

0

ブラウザの互換性に関するコンパイルサポートの問題だと思います。マップを使用して同じことを実現できます。

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)


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.