Jak znaleźć klucze hash?

Znam w obiektach javascript dwa razy jako hashe, ale nie byłem w stanie znaleźć wbudowanej funkcji, aby uzyskać klucze

var h = {a:'b',c:'d'};

I want something like

var k = h.keys() ; // k = ['a','c'];

To jest proste, aby napisać funkcję samodzielnie iterować nad elementami i dodać klucze do tablicy, które zwracam, ale czy istnieje standardowy sposób, aby to zrobić?

Czuję, że to musi być prosta wbudowana funkcja, za którą tęskniłem, ale nie mogę jej znaleźć!

Author: Aᴍɪʀ, 2008-08-20

9 answers

We współczesnym JavaScript (ECMAScript 5) istnieje funkcja o nazwie Object.keys wykonanie tej operacji:

var obj = { "a" : 1, "b" : 2, "c" : 3};
alert(Object.keys(obj)); // will output ["a", "b", "c"]

Szczegóły zgodności można znaleźć tutaj .

Na stronie Mozilla {[5] } znajduje się również fragment dla wstecznej kompatybilności:

if(!Object.keys) Object.keys = function(o){
   if (o !== Object(o))
      throw new TypeError('Object.keys called on non-object');
   var ret=[],p;
   for(p in o) if(Object.prototype.hasOwnProperty.call(o,p)) ret.push(p);
   return ret;
}
 279
Author: Ivan Nevostruev,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-03-06 15:05:47

W przypadku kodu produkcyjnego wymagającego dużej kompatybilności z przeglądarkami klienckimi proponuję odpowiedź Ivana Nevostrueva powyżej z shimem, aby zapewnić Object.keys w starszych przeglądarkach. Jednak możliwe jest uzyskanie dokładnej funkcjonalności, o którą prosi się za pomocą nowej funkcji ECMA defineProperty.

Od ECMAScript 5-obiekt.defineProperty

Od ECMA5 możesz użyć Object.defineProperty() aby zdefiniować nieoznaczalne właściwości. Na aktualna kompatybilność wciąż ma wiele do zrobienia pożądane, ale to powinno ostatecznie stać się użyteczne we wszystkich przeglądarkach. (Zwróć szczególną uwagę na aktualną niekompatybilność z IE8!)

Object.defineProperty(Object.prototype, 'keys', {
  value: function keys() {
    var keys = [];
    for(var i in this) if (this.hasOwnProperty(i)) {
      keys.push(i);
    }
    return keys;
  },
  enumerable: false
});

var o = {
    'a': 1,
    'b': 2
}

for (var k in o) {
    console.log(k, o[k])
}

console.log(o.keys())

# OUTPUT
# > a 1
# > b 2
# > ["a", "b"]

Jednakże, ponieważ ECMA5 już dodał Object.keys równie dobrze możesz użyć:

Object.defineProperty(Object.prototype, 'keys', {
  value: function keys() {
    return Object.keys(this);
  },
  enumerable: false
});

Oryginalna odpowiedź

Object.prototype.keys = function ()
{
  var keys = [];
  for(var i in this) if (this.hasOwnProperty(i))
  {
    keys.push(i);
  }
  return keys;
}

Edit: ponieważ ta odpowiedź jest już od jakiegoś czasu pozostawię powyższe nietknięte. Każdy, kto to czyta, powinien również przeczytać odpowiedź Ivana Nevostrueva poniżej.

Nie ma możliwości tworzenia funkcji prototypowych nieoznaczalne, co prowadzi do tego, że zawsze pojawiają się w pętlach for-in, które nie używają hasOwnProperty. Nadal uważam, że ta odpowiedź byłaby idealna, gdyby rozszerzenie prototypu obiektu nie było tak bałaganiarskie.

 80
Author: AnnanFay,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-05 12:52:59

Możesz użyć Object.keys

Object.keys(h)
 42
Author: Leticia Santos,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-05 12:53:30

Możesz użyć podkreślenia.js , która jest biblioteką narzędzi Javascript.

_.keys({one : 1, two : 2, three : 3}); 
// => ["one", "two", "three"]
 33
Author: timotti,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-08-11 22:10:20

To najlepsze, co możesz zrobić, o ile wiem...

var keys = [];
for (var k in h)keys.push(k);
 13
Author: danb,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-08-20 21:49:23

Używając jQuery możesz uzyskać klucze w następujący sposób:

var bobject =  {primary:"red",bg:"maroon",hilite:"green"};
var keys = [];
$.each(bobject, function(key,val){ keys.push(key); });
console.log(keys); // ["primary", "bg", "hilite"]

Lub:

var bobject =  {primary:"red",bg:"maroon",hilite:"green"};
$.map(bobject, function(v,k){return k;});
Dzięki @pimlottc
 8
Author: chim,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-07 10:02:48

Wierzę, że możesz przechodzić przez właściwości obiektu używając for / in, więc możesz zrobić coś takiego:

function getKeys(h) {
  Array keys = new Array();
  for (var key in h)
    keys.push(key);
  return keys;
}
 6
Author: palmsey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-08-20 21:51:08

Chciałem użyć najwyżej ocenionej odpowiedzi powyżej

Object.prototype.keys = function () ...

Jednak w połączeniu z google maps API v3 google maps jest niefunkcjonalne.

for (var key in h) ...
Działa dobrze.
 4
Author: Matthew Darwin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-07-24 15:02:00

Jeśli próbujesz uzyskać tylko elementy, ale nie Funkcje, Ten kod może Ci pomóc

this.getKeys = function() {

var keys = new Array();
for(var key in this) {

    if( typeof this[key] !== 'function') {

        keys.push(key);
    }
}
return keys;

}

Jest to część mojej implementacji HashMap i chcę tylko kluczy, {[1] } jest obiektem hashmap zawierającym klucze

 1
Author: zeacuss,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-05 12:54:16