Альтернативная версия для 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]]); 
Другие вопросы по тегам