versiones support es8 ecmascript browsers javascript internet-explorer browser ecmascript-6

javascript - support - Versión alternativa para Object.values()



javascript ecmascript (7)

Estoy buscando una versión alternativa para la función Object.values() .
Como se describe aquí, las funciones no se admiten en Internet Explorer.

Al ejecutar el siguiente código de ejemplo:

var obj = { foo: ''bar'', baz: 42 }; console.log(Object.values(obj)); // [''bar'', 42]

Funciona tanto en Firefox como en Chrome, pero arroja el siguiente error en IE11:

Objeto no soporta propiedad o método "valores"

Aquí puedes probarlo: Fiddle .

Entonces, ¿qué sería una solución rápida?


Dado que Object es una implementación reciente ( no tan ), si desea admitir todos los navegadores (también conocido como IE8 e inferior), debe crear su propia función:

function objectValues(obj) { var res = []; for (var i in obj) { if (obj.hasOwnProperty(i)) { res.push(obj[i]); } } return res; }

PD: Acabo de notar la etiqueta ecmascript-6 . Por cierto, mantengo esta respuesta aquí, en caso de que alguien la necesite.


Object.values ​​() es parte de la especificación ES8 (junio de 2017). Usando Cordova, me di cuenta de que Android 5.0 Webview no lo admite. Entonces, hice lo siguiente, creando la función polyfill solo si la función no es compatible:

if (!Object.values) Object.values = o=>Object.keys(o).map(k=>o[k]);


Para las personas que usan UnderscoreJS , puede obtener valores de objetos usando _.values :

var obj = { foo: ''bar'', baz: 42 }; console.log(_.values(obj)); // [''bar'', 42]


Puede obtener una matriz de claves con Object.keys() y luego usar map() para obtener valores.

var obj = { foo: ''bar'', baz: 42 }; var values = Object.keys(obj).map(function(e) { return obj[e] }) console.log(values)

Con ES6 puede escribir esto en una línea usando las funciones de flecha.

var values = Object.keys(obj).map(e => obj[e])


Puede utilizar un polyfill:

const valuesPolyfill = function values (object) { return Object.keys(object).map(key => object[key]); }; const values = Object.values || valuesPolyfill; console.log(values({ a: 1, b: 2, c: 3 }));


Sé que es un tema viejo. Estaba jugando alrededor y solo quiero agregar otra implementación. Es simplemente la versión de mapa con el mapa implementado con una reducción:

let obj = { foo: ''bar'', baz: 42 }; const valueArray = Object.keys(obj).reduce((acc, key) => { acc.push(obj[key]); return acc; }, []); console.log(valueArray);

Hace el trabajo pero tiene algo que me molesta. La función reductora usa obj y el obj no se inyectó en él. Debemos evitar las variables globales dentro de las funciones y hacer que nuestras funciones sean más comprobables . Así que prefiero esta versión con un asistente de función de reductor que toma el obj como parámetro y devuelve la función de reductor real . Se vuelve:

let obj = { foo: ''bar'', baz: 42 }; // reducer function helper take obj and return the actual reducer function let reducerFuncHelper= obj => (acc, key) => { acc.push(obj[key]); return acc; } //much better const valueArray = Object.keys(obj).reduce(reducerFuncHelper(obj), []); console.log(valueArray);


var x = {Name: ''John'', Age: 30, City: ''Bangalore''}; Object.prototype.values = function(obj) { var res = []; for (var i in obj) { if (obj.hasOwnProperty(i)) { res.push(obj[i]); } } return res; }; document.getElementById("tag").innerHTML = Object.values(x)

<p id="tag"></p>