Uncaught TypeError: Object.values ​​не є функцією JavaScript


80

У мене є такий простий об’єкт, як наведений нижче:

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()?


Яким браузером ви користуєтесь, оскільки згідно з MDN його не можна було підтримати
Mark C.

@MarkC. Я використовую Google Chrome 52.0.2743.82
Алекс Фалленштедт

Відповіді:


224

.valuesне підтримується у багатьох браузерах - ви можете використати, .mapщоб отримати масив усіх значень:

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

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


2
Дивно. .valuesздається таким потужним. Дякую, що показали мені альтернативу. Зараз це набагато більше сенсу!
Алекс Фалленштедт

1
(psst, mdn, хоча дивовижність - це не "офіційна" документація - tc39.github.io/ecma262/#sec-object.values )
evolutionxbox

Тут не згадується те, що Object.keys переставляє повернутий масив у масив, як об’єкти із випадковим упорядкуванням ключів, тому значення повернення можуть бути не в тому самому порядку, як у вихідному об’єкті. var anObj = {100: 'a', 2: 'b', 7: 'c'}; console.log (Object.keys (anObj)); // консоль: ['2', '7', '100']
user1502826

2
Клавіші об’єктів у будь-якому випадку впорядковані, тому порядок масиву не повинен мати значення.
tymeJV

IE 11 - це єдиний сучасний браузер, який не підтримує Object.values(). Просто вкусив нас сьогодні вранці. Ми тестували на Chrome, але не IE. Дякую, @tymeJV, за чудову відповідь та приклад.
Олексій

19

Також варто зазначити, що лише версії Node> = 7.0.0 повністю підтримують це.

http://node.green


1
зіткнувся з цим запущеним тестом на жарт, я думав, що перебуваю на вузлі v8, але виявляється, що я був на вузлі v6. перевірте версію вашого вузла! Вузол -v
russiansummer

вузол -v , щоб перевірити версію , а потім обновити: stackoverflow.com/a/53658468/5813940
russiansummer

16

Для тих, хто опинився тут і використовує 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

2

Схоже, ця проблема виправлена ​​в останній версії Safari. Я зіткнувся з тим самим питанням. Ця проблема виникає у версії браузера 9.0.1 і не виникає в 10.1.1

Редагування, щоб додати вкладення:

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

1
У вас є посилання, якими ви могли б поділитися для цієї інформації? Звіт про помилку чи щось інше?
Тім Хатчісон

У мене немає посилання. Системи Mac, що мають версії 9.0x, постійно викликають проблему. Але моя система, що містить 10.1.1, не викликає тієї ж проблеми.
Венката

2

Використання "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'

0

Я думаю, проблема в підтримці компіляції щодо сумісності браузерів. Ви можете використовувати карту, щоб досягти того ж.

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)

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.values(d) });
console.log(unpick)


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.