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)
Ответ 8
Рассмотрите возможность использования _.values(object)
Документы: https://lodash.com/docs/4.17.11#values