88 votes

Erreur de Type Non Rattrapée : Object.values n'est pas une fonction JavaScript

J'ai un objet simple comme celui ci-dessous :

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

J'ai besoin de créer deux tableaux. Le premier tableau est un tableau de toutes les clés de l'objet. J'ai créé ce tableau par :

var labels = Object.keys(countries);

Cela fonctionne bien. J'obtiens un tableau de pays. Maintenant, lorsque j'essaie de créer un tableau à partir des valeurs...

var labels = Object.values(countries);

Je reçois cette erreur : Uncaught TypeError: Object.values is not a function JavaScript

Je ne sais pas ce que je fais de mal. I console.log countries avant et après que je déclare labels et l'objet reste le même. Comment utiliser correctement Object.values() ?

0 votes

Quel est le navigateur que vous utilisez, car selon MDN, il ne pourrait pas être supporté par

0 votes

@MarkC. J'utilise Google Chrome 52.0.2743.82.

241voto

tymeJV Points 48178

.values n'est pas supporté par de nombreux navigateurs - vous pouvez utiliser .map pour obtenir un tableau de toutes les valeurs :

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

Voir le document MDN : https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/values ou Doc officiel : https://tc39.github.io/ecma262/#sec-object.values (merci à @evolutionxbox pour la correction)

2 votes

Étrange. .values semble si puissant. Merci de m'avoir montré une alternative. Cela a beaucoup plus de sens maintenant !

1 votes

(psst, mdn, bien qu'il soit étonnant, n'est pas une documentation "officielle"). tc39.github.io/ecma262/#sec-object.values )

0 votes

Ce qui n'est pas mentionné ici, c'est que Object.keys réarrange le tableau retourné dans des objets de type tableau avec un ordre aléatoire des clés, donc les valeurs retournées peuvent ne pas être dans le même ordre que dans l'objet original. var anObj = { 100 : 'a', 2 : 'b', 7 : 'c' } ; console.log(Object.keys(anObj)) ; // console : ['2', '7', '100']

20voto

phobos Points 332

Il convient également de noter que seules les versions Node >= 7.0.0 supportent pleinement cette fonctionnalité.

http://node.green

1 votes

J'ai rencontré ce problème en exécutant des tests jest, je pensais que j'étais sur node v8 mais il s'avère que j'étais sur node v6. vérifiez votre version de node ! node -v

0 votes

Node -v pour vérifier la version et ensuite pour mettre à jour : stackoverflow.com/a/53658468/5813940

17voto

j3ff Points 1612

Pour ceux qui se sont retrouvés ici et qui utilisent Angular, ajouter import 'core-js/es7/object'; a polyfills.ts a résolu le problème pour moi.

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

3voto

Utilisation de "for...in" comme discuté à mozilla : https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_objects/Object/values

Voici le code que j'ai utilisé :

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'

2voto

Venkata Points 11

Il semble que ce problème soit résolu dans la dernière version de Safari. J'ai rencontré le même problème. Ce problème se produit dans la version 9.0.1 du navigateur et ne se produit pas dans la version 10.1.1.

Édition pour ajouter les pièces jointes :

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

1 votes

Avez-vous une référence que vous pourriez partager pour cette information ? Un rapport de bogue ou autre ?

0 votes

Je n'ai pas de référence. Les systèmes Mac portant les versions 9.0x causent constamment le problème. Mais mon système portant la version 10.1.1 ne pose pas le même problème.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X