Сведения о вопросе

Fedya

20:34, 21st August, 2020

Теги

javascript   object   key    

Как найти ключи a hash?

Просмотров: 511   Ответов: 9

Я знаю, что в javascript объекты удваиваются как хэши, но мне не удалось найти встроенную функцию для получения ключей

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

Я хочу что-то вроде

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

Это просто написать функцию самостоятельно, чтобы перебирать элементы и добавлять ключи к массиву, который я возвращаю, но есть ли стандартный более чистый способ сделать это?

Я все время чувствую, что это должно быть простая встроенная функция, которую я пропустил, но я не могу ее найти!



  Сведения об ответе

nYU

02:41, 21st August, 2020

В современном 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;
}


  Сведения об ответе

crush

21:06, 1st October, 2020

Для производственного кода, требующего большой совместимости с клиентскими браузерами, я все еще предлагаю ответ Ивана Невоструева выше с оболочкой для обеспечения Object.keys в старых браузерах. Тем не менее, можно получить точную функциональность, запрошенную с помощью новой функции ECMA defineProperty .

Как из 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;
}

Edit: поскольку этот ответ уже некоторое время существует, я оставлю вышеизложенное нетронутым. Любой, кто читает это, должен также прочитать ответ Ивана Невоструева ниже.

Нет никакого способа сделать прототипные функции неисчисляемыми, что приводит к тому, что они всегда оказываются в циклах for-in, которые не используют hasOwnProperty . Я все еще думаю, что этот ответ был бы идеальным, если бы расширение прототипа объекта не было таким беспорядочным.


  Сведения об ответе

pumpa

18:18, 17th August, 2020

вы можете использовать Object.keys

Object.keys(h)


  Сведения об ответе

$DOLLAR

17:12, 7th August, 2020

Вы можете использовать Underscore.js, который является служебной библиотекой Javascript.

_.keys({one : 1, two : 2, three : 3}); 
// => ["one", "two", "three"]


  Сведения об ответе

padenie

08:11, 28th August, 2020

Это лучшее, что ты можешь сделать, насколько я знаю...

var keys = [];
for (var k in h)keys.push(k);


  Сведения об ответе

fo_I_K

00:48, 5th August, 2020

используя 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


  Сведения об ответе

park

17:19, 29th August, 2020

Я считаю, что вы можете перебирать свойства объекта с помощью for/in,, поэтому вы можете сделать что-то вроде этого:

function getKeys(h) {
  Array keys = new Array();
  for (var key in h)
    keys.push(key);
  return keys;
}


  Сведения об ответе

pumpa

12:54, 28th August, 2020

Я хотел использовать ответ с самым высоким рейтингом выше

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

Однако при использовании в сочетании с google maps API v3 google maps не работает.

for (var key in h) ...

хорошо работать.


  Сведения об ответе

COOL

01:08, 24th August, 2020

если вы пытаетесь получить только элементы, но не функции, то этот код может помочь вам

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, содержащий ключи


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться