Uncaught TypeError: Object.values ​​không phải là một JavaScript hàm


80

Tôi có một đối tượng đơn giản như sau:

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

Tôi cần tạo hai mảng. Mảng đầu tiên là một mảng gồm tất cả các khóa từ đối tượng. Tôi đã tạo mảng này bằng cách:

var labels = Object.keys(countries);

Điều này hoạt động tốt. Tôi có được một loạt các quốc gia. Bây giờ khi tôi cố gắng tạo một mảng từ các giá trị ...

var labels = Object.values(countries);

Tôi gặp lỗi này: Uncaught TypeError: Object.values is not a function JavaScript

Tôi không biết mình đang làm gì sai. Tôi console.log countriestrước và sau khi tôi khai báo labelsvà đối tượng vẫn như cũ. Làm thế nào để sử dụng đúng cách Object.values()?


Trình duyệt nào bạn đang sử dụng, bởi vì theo MDN nó có thể không được hỗ trợ
Mark C.

@MarkC. Tôi đang sử dụng Google Chrome 52.0.2743.82
Alex Fallenstedt

Câu trả lời:


224

.valueskhông được hỗ trợ trong nhiều trình duyệt - bạn có thể sử dụng .mapđể lấy một mảng tất cả các giá trị:

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

Xem tài liệu MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/values hoặc tài liệu chính thức: https://tc39.github.io/ecma262/#sec- object.values (cảm ơn @evolutionxbox đã chỉnh sửa)


2
Thật kỳ lạ. .valuescó vẻ rất mạnh mẽ. Cảm ơn bạn đã chỉ cho tôi một giải pháp thay thế. Bây giờ nó có ý nghĩa hơn rất nhiều!
Alex Fallenstedt

1
(psst, mdn trong khi đáng kinh ngạc không phải là tài liệu "chính thức" - tc39.github.io/ecma262/#sec-object.values )
Evolutionxbox

Điều không được đề cập ở đây là Object.keys sắp xếp lại mảng được trả về trong mảng giống như các đối tượng có thứ tự khóa ngẫu nhiên vì vậy các giá trị trả về có thể không theo thứ tự như trong đối tượng ban đầu. var anObj = {100: 'a', 2: 'b', 7: 'c'}; console.log (Object.keys (anObj)); // bảng điều khiển: ['2', '7', '100']
user1502826

2
Các khóa đối tượng dù sao cũng không có thứ tự, vì vậy thứ tự mảng không quan trọng.
tymeJV 21/12/17

IE 11 là trình duyệt hiện đại duy nhất không hỗ trợ Object.values(). Chỉ cần cắn chúng tôi sáng nay. Chúng tôi đã thử nghiệm trên Chrome nhưng không phải IE. Cảm ơn @tymeJV, vì câu trả lời và ví dụ tuyệt vời.
Alex


16

Đối với những người đã kết thúc ở đây và đang sử dụng Angular, việc thêm import 'core-js/es7/object';vào polyfills.tstệp đã giải quyết được vấn đề cho tôi.

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

Có vẻ như sự cố này đã được khắc phục trong Safari phiên bản mới nhất. Tôi đã đến cùng một vấn đề. Sự cố này xảy ra trong phiên bản trình duyệt 9.0.1 và không xảy ra trong 10.1.1

Chỉnh sửa để thêm các tệp đính kèm:

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

1
Bạn có tài liệu tham khảo mà bạn có thể chia sẻ cho thông tin này? Một báo cáo lỗi hay gì đó?
Tim Hutchison

Tôi không có tài liệu tham khảo. Hệ thống mac chạy phiên bản 9.0x liên tục gây ra sự cố. Nhưng hệ thống của tôi mang 10.1.1 không gây ra vấn đề tương tự.
Venkata

2

Sử dụng "for ... in" như đã thảo luận tại mozilla: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_objects/Object/values

Đây là mã tôi đã sử dụng:

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

Tôi nghĩ rằng vấn đề trong hỗ trợ biên dịch về khả năng tương thích của trình duyệt, Bạn có thể sử dụng bản đồ để đạt được điều tương tự.

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)


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.