У меня есть простой объект, подобный приведенному ниже:
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()
?
javascript
arrays
node.js
object
cross-browser
Алекс Фалленштедт
источник
источник
Ответы:
.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 за исправление)
источник
.values
кажется таким мощным. Спасибо, что показали мне альтернативу. Теперь это имеет смысл!Object.values()
. Просто укусил нас этим утром. Мы тестировали Chrome, но не IE. Спасибо, @tymeJV, за отличный ответ и пример.Также стоит отметить, что только версии Node> = 7.0.0 полностью поддерживают это.
http://node.green
источник
Для тех, кто оказался здесь и использует 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
источник
Похоже, эта проблема исправлена в последней версии Safari. Я столкнулся с той же проблемой. Эта проблема возникает в версии браузера 9.0.1 и не возникает в 10.1.1.
Редактирование для добавления вложений:
[snippet][1] [object value][2] [browser version][3]
источник
Использование "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'
источник
Я думаю, проблема в поддержке компиляции совместимости браузеров, вы можете использовать карту для достижения того же.
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)
источник
Рассмотрите возможность использования
_.values(object)
Документы: https://lodash.com/docs/4.17.11#values
источник