포착되지 않은 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에 따라이 할 수 없기 때문에 어떤 브라우저 당신이 사용하는 지원
마크 C.

@MarkC. Google Chrome 52.0.2743.82를 사용하고 있습니다
Alex Fallenstedt 2016 년

답변:


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너무 강력 해 보입니다. 대안을 보여 주셔서 감사합니다. 이제 훨씬 더 의미가 있습니다!
Alex Fallenstedt

1
(- 잠깐만는 놀라운되는 동안 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에게 감사드립니다.
Alex


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
이 정보에 대해 공유 할 수있는 참조가 있습니까? 버그 보고서 같은 거요?
Tim Hutchison 17

나는 참조가 없습니다. 9.0x 버전을 사용하는 Mac 시스템이 지속적으로 문제를 일으 킵니다. 그러나 10.1.1을 지원하는 내 시스템은 동일한 문제를 일으키지 않습니다.
Venkata

2

mozilla에서 논의한대로 "for ... in"사용 : 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)


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.