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()?

Alex Fallenstedt
źródło
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ę)

tymeJV
źródło
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
19

Warto również zauważyć, że tylko wersje Node> = 7.0.0 w pełni to obsługują.

http://node.green

fobos
źródło
1
wpadłem na te uruchomione testy żartów, myślałem, że jestem na węźle v8, ale okazuje się, że byłem na węźle v6. sprawdź wersję swojego węzła! node -v
russiansummer
node -v, aby sprawdzić wersję, a następnie zaktualizować: stackoverflow.com/a/53658468/5813940
russiansummer
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
j3ff
źródło
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]
Venkata
źródło
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'
Manohar Reddy Poreddy
źródło
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)

KARTHIKEYAN.A
źródło