Nicht erfasster TypeError: Object.values ​​ist keine JavaScript-Funktion


80

Ich habe ein einfaches Objekt wie das folgende:

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

Ich muss zwei Arrays erstellen. Das erste Array ist ein Array aller Schlüssel aus dem Objekt. Ich habe dieses Array erstellt von:

var labels = Object.keys(countries);

Das funktioniert gut. Ich erhalte eine Reihe von Ländern. Wenn ich jetzt versuche, ein Array aus den Werten zu erstellen ...

var labels = Object.values(countries);

Ich erhalte diesen Fehler: Uncaught TypeError: Object.values is not a function JavaScript

Ich weiß nicht, was ich falsch mache. Ich console.log countriesvorher und nachher erkläre labelsund das Objekt bleibt gleich. Wie verwende ich richtig Object.values()?


Welchen Browser verwenden Sie, weil er laut MDN nicht unterstützt werden konnte
Mark C.

@ MarkC. Ich benutze Google Chrome 52.0.2743.82
Alex Fallenstedt

Antworten:


224

.valueswird in vielen Browsern nicht unterstützt - Sie können verwenden .map, um ein Array aller Werte abzurufen:

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

Siehe MDN-Dokument: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/values oder offizielles Dokument: https://tc39.github.io/ecma262/#sec- object.values (danke @evolutionxbox für die Korrektur)


2
Seltsam. .valuesscheint so mächtig. Vielen Dank, dass Sie mir eine Alternative gezeigt haben. Es macht jetzt viel mehr Sinn!
Alex Fallenstedt

1
(psst, mdn, obwohl es erstaunlich ist, ist keine "offizielle" Dokumentation - tc39.github.io/ecma262/#sec-object.values )
evolutionxbox

Was hier nicht erwähnt wird, ist, dass Object.keys zurückgegebene Arrays in Arrays wie Objekte mit zufälliger Schlüsselreihenfolge neu anordnet, sodass die Rückgabewerte möglicherweise nicht in derselben Reihenfolge wie im ursprünglichen Objekt liegen. var anObj = {100: 'a', 2: 'b', 7: 'c'}; console.log (Object.keys (anObj)); // Konsole: ['2', '7', '100']
user1502826

2
Objektschlüssel sind sowieso ungeordnet, daher sollte die Array-Reihenfolge keine Rolle spielen.
TymeJV

IE 11 ist ungefähr der einzige moderne Browser, der nicht unterstützt wird Object.values(). Habe uns heute Morgen gebissen. Wir hatten auf Chrome getestet, aber nicht auf IE. Vielen Dank, @tymeJV, für die großartige Antwort und das Beispiel.
Alex


16

Für diejenigen, die hier gelandet sind und Angular verwenden, hat das Hinzufügen import 'core-js/es7/object';zur polyfills.tsDatei das Problem für mich gelöst.

/** 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

Dieses Problem wurde anscheinend in der neuesten Version von Safari behoben. Ich bin um das gleiche Problem herumgekommen. Dieses Problem tritt in Browserversion 9.0.1 auf und tritt in 10.1.1 nicht auf

Bearbeiten, um die Anhänge hinzuzufügen:

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

1
Haben Sie eine Referenz, die Sie für diese Informationen teilen könnten? Ein Fehlerbericht oder so?
Tim Hutchison

Ich habe keine Referenz. Die Mac-Systeme mit 9.0x-Versionen verursachen das Problem weiterhin. Mein System mit 10.1.1 verursacht jedoch nicht das gleiche Problem.
Venkata

2

Verwenden von "for ... in", wie unter Mozilla beschrieben: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_objects/Object/values

Hier ist der Code, den ich verwendet habe:

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

Ich denke, Problem bei der Kompilierungsunterstützung in Bezug auf die Browserkompatibilität. Sie können map verwenden , um dasselbe zu erreichen.

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)


Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.