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()?

Alex Fallenstedt
quelle
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)

tymeJV
quelle
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
18

Es ist auch erwähnenswert, dass nur Knotenversionen> = 7.0.0 dies vollständig unterstützen.

http://node.green

Phobos
quelle
1
Ich dachte, ich wäre auf Knoten v8, aber es stellte sich heraus, dass ich auf Knoten v6 war. Überprüfen Sie Ihre Knotenversion! Knoten -v
russiansummer
Knoten -v Version zu überprüfen und dann zu aktualisieren: stackoverflow.com/a/53658468/5813940
russiansummer
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
j3ff
quelle
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]
Venkata
quelle
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'
Manohar Reddy Poreddy
quelle
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)

KARTHIKEYAN.A
quelle