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 countries
antes y después declaro labels
y el objeto sigue siendo el mismo. ¿Cómo lo uso correctamente Object.values()
?
javascript
arrays
node.js
object
cross-browser
Alex Fallenstedt
fuente
fuente
Respuestas:
.values
no es compatible con muchos navegadores; puede usarlo.map
para 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)
fuente
.values
parece tan poderoso. Gracias por mostrarme una alternativa. ¡Tiene mucho más sentido ahora!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.También vale la pena señalar que solo las versiones de Node> = 7.0.0 son totalmente compatibles con esto.
http://node.green
fuente
Para aquellos que terminaron aquí y están usando Angular, agregar
import 'core-js/es7/object';
alpolyfills.ts
archivo 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
fuente
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]
fuente
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'
fuente
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)
fuente
Considere usar
_.values(object)
Documentos: https://lodash.com/docs/4.17.11#values
fuente