94

I have a simple object like the one below:

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

I need to create two arrays. The first array is an array of all the keys from the object. I created this array by:

var labels = Object.keys(countries);

This works well. I obtain an array of countries. Now when I try to create an array from the values...

var labels = Object.values(countries);

I get this error: Uncaught TypeError: Object.values is not a function JavaScript

I don't know what I am doing wrong. I console.log countries before and after I declare labels and the object remains the same. How do I properly use Object.values()?

2
  • What browser are you using, because according to MDN it could not be supported Commented Aug 3, 2016 at 15:58
  • @MarkC. I am using Google Chrome 52.0.2743.82 Commented Aug 3, 2016 at 16:00

7 Answers 7

251

.values is unsupported in many browsers - you can use .map to get an array of all the values:

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

See MDN doc: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/values or Official doc: https://tc39.github.io/ecma262/#sec-object.values (thanks @evolutionxbox for correction)

Sign up to request clarification or add additional context in comments.

5 Comments

Strange. .values seems so powerful. Thank you for showing me an alternative. It makes a lot more sense now!
(psst, mdn whilst being amazing is not "official" documentation - tc39.github.io/ecma262/#sec-object.values)
What is not mention here is that Object.keys does rearrange returned array in array like objects with random key ordering so the return values may not be in the same order as in the original object. var anObj = { 100: 'a', 2: 'b', 7: 'c' }; console.log(Object.keys(anObj)); // console: ['2', '7', '100']
Object keys are unordered anyways, so the array order shouldn't matter.
IE 11 is about the only modern browser not supporting Object.values(). Just bit us this morning. We'd tested on Chrome but not IE. Thanks, @tymeJV, for the great answer and example.
20

It's also worth noting that only Node versions >= 7.0.0 fully support this.

http://node.green

2 Comments

ran into this running jest tests, i thought i was on node v8 but turns out i was on node v6. check your node version! node -v
node -v to check version and then to upgrade: stackoverflow.com/a/53658468/5813940
18

For those who ended up here and are using Angular, adding import 'core-js/es7/object'; to polyfills.ts file solved the problem for me.

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

Comments

3

Using "for...in" as discussed at mozilla: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_objects/Object/values

Here is the code I used:

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'

Comments

2

Looks like this issue is fixed in Safari latest version. I came around the same issue. This issue occurs in browser version 9.0.1 and does not occur in 10.1.1

Editing to add the attachments:

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

2 Comments

Do you have a reference you could share for this information? A bug report or something?
I donot have a reference. The mac systems carrying 9.0x versions are persistently causing the issue. But my system carrying 10.1.1 does not cause the same issue.
0

I think issue in compilation support on browsers compatibility, You can use map to achieve the same.

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)

Comments

0

Consider using _.values(object)

Docs: https://lodash.com/docs/4.17.11#values

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.