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, он не может поддерживаться
Марк С.
@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 за исправление)

tymeJV
источник
2
Странный. .valuesкажется таким мощным. Спасибо, что показали мне альтернативу. Теперь это имеет смысл!
Alex Fallenstedt
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)); // console: ['2', '7', '100']
user1502826
2
Ключи объектов в любом случае неупорядочены, поэтому порядок в массиве не имеет значения.
tymeJV
IE 11 - чуть ли не единственный современный браузер, который не поддерживает Object.values(). Просто укусил нас этим утром. Мы тестировали Chrome, но не IE. Спасибо, @tymeJV, за отличный ответ и пример.
Alex
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
j3ff
источник
2

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

Редактирование для добавления вложений:

[snippet][1]
[object value][2]
[browser version][3]
Венката
источник
1
У вас есть ссылка, которой вы могли бы поделиться с этой информацией? Отчет об ошибке или что-то в этом роде?
Тим Хатчисон
У меня нет ссылки. Системы Mac с версиями 9.0x постоянно вызывают проблему. Но моя система с 10.1.1 не вызывает такой же проблемы.
Venkata
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)

КАРТИКЕЯН А.
источник