Uncaught TypeError: Object.values ​​nie jest funkcją JavaScript


80

Mam prosty obiekt taki jak ten poniżej:

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

Muszę utworzyć dwie tablice. Pierwsza tablica to tablica wszystkich kluczy z obiektu. Utworzyłem tę tablicę przez:

var labels = Object.keys(countries);

To działa dobrze. Otrzymuję szereg krajów. Teraz, gdy próbuję utworzyć tablicę z wartości ...

var labels = Object.values(countries);

Otrzymuję ten błąd: Uncaught TypeError: Object.values is not a function JavaScript

Nie wiem, co robię źle. Ja console.log countriesprzed i po oświadczam, labelsa przedmiot pozostaje ten sam. Jak prawidłowo używać Object.values()?


Jakiej przeglądarki używasz, ponieważ według MDN nie mogłaby być obsługiwana
Mark C.

@MarkC. Używam Google Chrome 52.0.2743.82
Alex Fallenstedt

Odpowiedzi:


224

.valuesnie jest obsługiwany w wielu przeglądarkach - możesz użyć, .mapaby uzyskać tablicę wszystkich wartości:

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

Zobacz dokumentację MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/values lub Official doc: https://tc39.github.io/ecma262/#sec- object.values (dzięki @evolutionxbox za korektę)


2
Dziwne. .valueswydaje się tak potężny. Dziękuję za pokazanie mi alternatywy. Teraz ma to o wiele więcej sensu!
Alex Fallenstedt

1
(psst, mdn, mimo że jest niesamowity, nie jest "oficjalną" dokumentacją - tc39.github.io/ecma262/#sec-object.values )
evolutionxbox

Nie wspomina się tutaj o tym, że Object.keys przestawia zwracaną tablicę w tablicy, podobnie jak obiekty z losowym porządkiem kluczy, więc zwracane wartości mogą nie być w tej samej kolejności, co w oryginalnym obiekcie. var anObj = {100: 'a', 2: 'b', 7: 'c'}; console.log (Object.keys (anObj)); // console: ['2', '7', '100']
user1502826

2
Klucze obiektów i tak są nieuporządkowane, więc kolejność w tablicy nie powinna mieć znaczenia.
tymeJV

IE 11 jest jedyną nowoczesną przeglądarką, która nie obsługuje Object.values(). Po prostu ugryzł nas dziś rano. Testowaliśmy na Chrome, ale nie na IE. Dzięki @tymeJV za świetną odpowiedź i przykład.
Alex


16

Dla tych, którzy tu trafili i używają Angulara, dodanie import 'core-js/es7/object';do polyfills.tspliku rozwiązało problem.

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

Wygląda na to, że ten problem został rozwiązany w najnowszej wersji Safari. Doszedłem do tego samego problemu. Ten problem występuje w przeglądarce w wersji 9.0.1 i nie występuje w wersji 10.1.1

Edycja w celu dodania załączników:

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

1
Czy masz referencje, którymi mógłbyś się podzielić z tymi informacjami? Raport o błędzie czy coś?
Tim Hutchison

Nie mam referencji. Systemy Mac z wersjami 9.0x nieustannie powodują problem. Ale mój system z wersją 10.1.1 nie powoduje tego samego problemu.
Venkata

2

Używanie „for ... in” omówione na mozilla: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_objects/Object/values

Oto kod, którego użyłem:

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

Myślę, że problem z obsługą kompilacji na kompatybilność przeglądarek, możesz użyć mapy, aby osiągnąć to samo.

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)


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.