Uncaught TypeError: Object.values ​​не является функцией JavaScript

У меня есть простой объект, как показано ниже:

var countries = {
    "Argentina":1,
    "Canada":2,
    "Egypt":1,
};

Мне нужно создать два массива. Первый массив - это массив всех ключей от объекта. Я создал этот массив с помощью:

var labels = Object.keys(countries);

Это хорошо работает. Я получаю множество стран. Теперь, когда я пытаюсь создать массив из значений...

var labels = Object.values(countries);

Я получаю эту ошибку: Uncaught TypeError: Object.values is not a function JavaScript

Я не знаю, что я делаю неправильно. Я console.log countries до и после того, как я объявляю labels и объект остается тем же. Как правильно использовать Object.values()?

Ответ 1

.values не поддерживается во многих браузерах - вы можете использовать .map для получения массива всех значений:

var vals = Object.keys(countries).map(function(key) {
    return countries[key];
});

См. MDN doc: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/values или Официальный документ: https://tc39.github.io/ecma262/#sec-object.values (спасибо @evolutionxbox для коррекция)

Ответ 2

Стоит также отметить, что только версии Node> = 7.0.0 полностью поддерживают это.

http://node.green

Ответ 3

Для тех, кто оказался здесь и использует Angular, добавив import 'core-js/es7/object'; чтобы файл polyfills.ts решил проблему за меня.

/** 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

Ответ 4

Похоже, эта проблема исправлена в последней версии Safari. Я пришел к тому же вопросу. Эта проблема возникает в браузере версии 9.0.1 и не возникает в 10.1.1

Редактирование, чтобы добавить вложения:

[snippet][1]
[object value][2]
[browser version][3]

Ответ 5

Использование "for... in", как обсуждалось в mozilla: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_objects/Object/values

Вот код, который я использовал:

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'

Ответ 6

.values не поддерживается во многих браузерах - вы можете использовать .map для получения массива всех значений:

var arr = [{ name: 'Steve',}, { name: 'Mike'}, { name: 'John'}];

function getStudentNames(students) {
   return students.map(x => x[Object.keys(x)]);
}

console.log(getStudentNames(arr));

Ответ 7

Я думаю, что проблема в поддержке компиляции в совместимости с браузерами, вы можете использовать map для достижения того же.

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)