TypeError no detectado: Object.values ​​no es una función de JavaScript


80

Tengo un objeto simple como el siguiente:

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

Necesito crear dos matrices. La primera matriz es una matriz de todas las claves del objeto. Creé esta matriz por:

var labels = Object.keys(countries);

Esto funciona bien. Obtengo una variedad de países. Ahora, cuando intento crear una matriz a partir de los valores ...

var labels = Object.values(countries);

Me sale este error: Uncaught TypeError: Object.values is not a function JavaScript

No sé qué estoy haciendo mal. Yo console.log countriesantes y después declaro labelsy el objeto sigue siendo el mismo. ¿Cómo lo uso correctamente Object.values()?


¿Qué navegador estás usando, porque según MDN no podría ser compatible
Mark C.

@MarkC. Estoy usando Google Chrome 52.0.2743.82
Alex Fallenstedt

Respuestas:


224

.valuesno es compatible con muchos navegadores; puede usarlo .mappara obtener una matriz de todos los valores:

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

Consulte el documento de MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/values o el documento oficial: https://tc39.github.io/ecma262/#sec- object.values (gracias @evolutionxbox por la corrección)


2
Extraño. .valuesparece tan poderoso. Gracias por mostrarme una alternativa. ¡Tiene mucho más sentido ahora!
Alex Fallenstedt

1
(psst, mdn aunque ser increíble no es documentación "oficial" - tc39.github.io/ecma262/#sec-object.values )
evolutionxbox

Lo que no se menciona aquí es que Object.keys reorganiza la matriz devuelta en una matriz como objetos con un orden de clave aleatorio, por lo que los valores devueltos pueden no estar en el mismo orden que en el objeto original. var anObj = {100: 'a', 2: 'b', 7: 'c'}; console.log (Object.keys (anObj)); // consola: ['2', '7', '100']
user1502826

2
Las claves de objeto están desordenadas de todos modos, por lo que el orden de la matriz no debería importar.
tymeJV

IE 11 es el único navegador moderno que no es compatible Object.values(). Sólo nos mordió esta mañana. Lo habíamos probado en Chrome pero no en IE. Gracias, @tymeJV, por la gran respuesta y ejemplo.
Alex


16

Para aquellos que terminaron aquí y están usando Angular, agregar import 'core-js/es7/object';al polyfills.tsarchivo resolvió el problema para mí.

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

Parece que este problema se solucionó en la última versión de Safari. Me encontré con el mismo problema. Este problema ocurre en la versión 9.0.1 del navegador y no ocurre en 10.1.1

Editando para agregar los archivos adjuntos:

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

1
¿Tiene una referencia que pueda compartir para obtener esta información? ¿Un informe de error o algo así?
Tim Hutchison

No tengo una referencia. Los sistemas mac que tienen versiones 9.0x están causando el problema de manera persistente. Pero mi sistema con 10.1.1 no causa el mismo problema.
Venkata

2

Usando "for ... in" como se discutió en mozilla: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_objects/Object/values

Aquí está el código que usé:

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

Creo que hay un problema en el soporte de compilación sobre la compatibilidad de los navegadores, puede usar mapa para lograr lo mismo.

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)


Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.