Альтернативная версия для Object.values ()
Я ищу альтернативную версию для Object.values()
функция.
Как описано здесь, функции не поддерживаются в Internet Explorer.
При выполнении следующего примера кода:
var obj = { foo: 'bar', baz: 42 };
console.log(Object.values(obj)); // ['bar', 42]
Он работает как в Firefox, так и в Chrome, но в IE11 выдает следующую ошибку:
Объект не поддерживает свойство или метод "значения"
Здесь вы можете проверить это: Fiddle.
Итак, что бы быстро исправить?
7 ответов
Вы можете получить массив ключей с Object.keys()
а затем использовать map()
чтобы получить значения.
var obj = { foo: 'bar', baz: 42 };
var values = Object.keys(obj).map(function(e) {
return obj[e]
})
console.log(values)
С ES6 вы можете написать это в одну строку, используя функции-стрелки.
var values = Object.keys(obj).map(e => obj[e])
Object.values () является частью спецификации ES8(июнь 2017 года). Используя Cordova, я понял, что Android 5.0 Webview не поддерживает его. Итак, я сделал следующее, создав функцию polyfill, только если эта функция не поддерживается:
if (!Object.values) Object.values = o=>Object.keys(o).map(k=>o[k]);
Поскольку Object является (не очень) недавней реализацией, если вы хотите поддерживать все браузеры (AKA IE8 и ниже), то вам нужно создать свою собственную функцию:
function objectValues(obj) {
var res = [];
for (var i in obj) {
if (obj.hasOwnProperty(i)) {
res.push(obj[i]);
}
}
return res;
}
PS: только что заметил ecmascript-6
тег. Кстати, я держу этот ответ здесь, на всякий случай, если он кому-то нужен.
Если вы уже используете core-js (например, с помощью Angular), вы можете просто импортировать соответствующий polyfill:
import 'core-js/es7/object';
Вы можете использовать полифилл:
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 }));
Для людей, использующих UnderscoreJS, вы можете получить значения объекта с помощью _.values
:
var obj = { foo: 'bar', baz: 42 };
console.log(_.values(obj)); // ['bar', 42]
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>
Поскольку я не нашел ответа на свои нужды:
var obj = { foo: 'bar', baz: 42 };
console.log(obj[Object.keys(obj)[0]]) // bar
console.log(obj[Object.keys(obj)[1]]) // 42
Использование возможности объектов обращаться к ним по буквам.
Лучший способ - заменить его методом значений ramda:
import * as R from 'ramda';
const obj = { foo: 'bar', test: 10 };
console.log(R.values(obj)) // ['bar', 10]
Я знаю, что это старая тема. Я играл arround и просто хочу добавить еще одну реализацию. Это просто версия карты с самой картой, реализованной с уменьшением:
let obj = { foo: 'bar', baz: 42 };
const valueArray = Object.keys(obj).reduce((acc, key) => {
acc.push(obj[key]);
return acc;
}, []);
console.log(valueArray);
Это делает работу, но есть кое-что, что беспокоит меня. Функция редуктора использует объект obj, и объект obj не был введен в него. Мы должны избегать глобальных переменных внутри функций и сделать наши функции более тестируемыми. Поэтому я предпочитаю эту версию с помощником функции редуктора, который принимает obj в качестве параметра, возвращающего фактическую функцию редуктора. Это становится:
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);
Вы можете получить массив ключей с помощью Object.keys(). Это также будет работать в IE. Object.values () вообще не требуется для получения значений, поскольку мы можем использовать ключи, полученные из Object.keys (), для получения значений, как показано ниже:
var obj = { foo: 'bar', baz: 42 };
var keyArray = Object.keys(obj);
for(var i = 0; i < keyArray.length; i++)
console.log(obj[keyArray[i]]);