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źć!
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;
}
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.
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)
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"]
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);
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 @pimlottcWarning: 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;
}
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.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
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