web-dev-qa-db-fra.com

Uncaught TypeError: 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);

Ça marche bien. J'obtiens un éventail de pays. Maintenant, quand j'essaie de créer un tableau à partir des valeurs ...

var labels = Object.values(countries);

J'ai cette erreur: Uncaught TypeError: Object.values is not a function JavaScript

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

59
Alex Fallenstedt

.values n'est pas pris en charge 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 doc 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)

182
tymeJV

Il est également intéressant de noter que seules les versions de nœud> = 7.0.0 le supportent pleinement. 

http://node.green

11
phobos

Pour ceux qui ont fini ici et qui utilisent Angular, l'ajout de import 'core-js/es7/object'; au fichier 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
5
j3ff

On dirait que ce problème est résolu dans la dernière version de safari. Je suis venu autour du même problème. Ce problème se produit dans la version 9.0.1 du navigateur et non dans 10.1.1.

édition pour ajouter les pièces jointes;

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

.values n'est pas pris en charge par de nombreux navigateurs. Vous pouvez utiliser .map pour obtenir un tableau de toutes les valeurs:

var arr = [{ name: 'Steve',}, { name: 'Mike'}, { name: 'John'}];

function getStudentNames(students) {
   return students.map(x => x[Object.keys(x)]);
}

console.log(getStudentNames(arr));

1
RadioactiveScript

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

Voici le code que j'ai utilisé:

function Object_values(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(Object_values(obj));             // prints   [ 'v1', 'v1', 'v1' ]
// OR
console.log(Object_values(obj).join(', '));  // prints   v1, v1, v1
1

Je pense que le problème dans le support de compilation sur la compatibilité des navigateurs, vous pouvez utiliser map pour atteindre le même objectif.

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)

0
KARTHIKEYAN.A

Pensez à utiliser _.values(object)

Docs: https://lodash.com/docs/4.17.11#values ​​

0
Matias Elorriaga