Как найти ключи от хэша?
Я знаю в javascript Объекты double как хэши, но мне не удалось найти встроенную функцию для получения ключей
var h = {a:'b',c:'d'};
Мне нужно что-то вроде
var k = h.keys() ; // k = ['a','c'];
Проще написать функцию для перебора элементов и добавить ключи к массиву, который я возвращаю, но есть ли стандартный способ сделать это?
Я все время чувствую, что это должна быть простая встроенная функция, которую я пропустил, но я не могу ее найти!
Ответы
Ответ 1
В современном javascript (ECMAScript 5) есть функция Object.keys
, выполняющая эту операцию:
var obj = { "a" : 1, "b" : 2, "c" : 3};
alert(Object.keys(obj)); // will output ["a", "b", "c"]
Сведения о совместимости можно найти здесь.
На сайте Mozilla также есть отрезка для обратной совместимости:
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;
}
Ответ 2
Для производственного кода, требующего большой совместимости с клиентскими браузерами, я все же предлагаю ответить Ивану Невоструеву выше с помощью прокладки, чтобы обеспечить Object.keys
в старых браузерах. Тем не менее, можно получить точную функциональность, запрошенную с использованием новой функции defineProperty
ECMA.
В соответствии с ECMAScript 5 - Object.defineProperty
В соответствии с ECMA5 вы можете использовать Object.defineProperty()
для определения неперечислимых свойств. текущая совместимость по-прежнему требует многого, но в конечном итоге это может стать полезным во всех браузерах. (Обратите внимание на текущую несовместимость с 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"]
Однако, поскольку ECMA5 уже добавил Object.keys
, вы также можете использовать:
Object.defineProperty(Object.prototype, 'keys', {
value: function keys() {
return Object.keys(this);
},
enumerable: false
});
Оригинальный ответ
Object.prototype.keys = function ()
{
var keys = [];
for(var i in this) if (this.hasOwnProperty(i))
{
keys.push(i);
}
return keys;
}
Изменить:. Так как этот ответ был на некоторое время, я оставлю это не тронутым. Любой, кто читает это, должен также прочитать ответ Ивана Невоструева ниже.
Нет способа сделать функции прототипа неперечислимыми, что приводит к тому, что они всегда появляются в циклах for-in, которые не используют hasOwnProperty. Я все еще думаю, что этот ответ был бы идеальным, если бы расширение прототипа Object не было настолько грязным.
Ответ 3
вы можете использовать Object.keys
Object.keys(h)
Ответ 4
Вы можете использовать Underscore.js, который является библиотекой утилиты Javascript.
_.keys({one : 1, two : 2, three : 3});
// => ["one", "two", "three"]
Ответ 5
Это лучшее, что вы можете сделать, насколько я знаю...
var keys = [];
for (var k in h)keys.push(k);
Ответ 6
с помощью jquery вы можете получить такие ключи...
var bobject = {primary:"red",bg:"maroon",hilite:"green"};
var keys = [];
$.each(bobject, function(key,val){ keys.push(key); });
console.log(keys); // ["primary", "bg", "hilite"]
Или -
var bobject = {primary:"red",bg:"maroon",hilite:"green"};
$.map(bobject, function(v,k){return k;});
благодаря @pimlottc
Ответ 7
Я считаю, что вы можете прокручивать свойства объекта, используя for/in, чтобы вы могли сделать что-то вроде этого:
function getKeys(h) {
Array keys = new Array();
for (var key in h)
keys.push(key);
return keys;
}
Ответ 8
Я хотел использовать верхний рейтинг выше
Object.prototype.keys = function () ...
Однако при использовании в сочетании с API-интерфейсом google maps v3 карты google не работают.
for (var key in h) ...
работает хорошо.
Ответ 9
если вы пытаетесь получить только элементы, но не функции, то этот код может помочь вам
this.getKeys = function() {
var keys = new Array();
for(var key in this) {
if( typeof this[key] !== 'function') {
keys.push(key);
}
}
return keys;
}
Это часть моей реализации HashMap, и мне нужны только ключи, "this" - это объект hashmap, содержащий ключи