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

Alex Fallenstedt
fuente
¿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)

tymeJV
fuente
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
19

También vale la pena señalar que solo las versiones de Node> = 7.0.0 son totalmente compatibles con esto.

http://node.green

fobos
fuente
1
Me encontré con estas pruebas de broma, pensé que estaba en el nodo v8 pero resultó que estaba en el nodo v6. compruebe la versión de su nodo! node -v
russiansummer
node -v para verificar la versión y luego para actualizar: stackoverflow.com/a/53658468/5813940
russiansummer
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
j3ff
fuente
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]
Venkata
fuente
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'
Manohar Reddy Poreddy
fuente
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)

KARTHIKEYAN.A
fuente