Как найти ключи хеша?

Более быстрые результаты могут быть достигнуты с помощью numpy.where .

Например, при настройке unubtu -

In [76]: df.iloc[np.where(df.A.values=='foo')]
Out[76]: 
     A      B  C   D
0  foo    one  0   0
2  foo    two  2   4
4  foo    two  4   8
6  foo    one  6  12
7  foo  three  7  14

Сроки сравнения:

In [68]: %timeit df.iloc[np.where(df.A.values=='foo')]  # fastest
1000 loops, best of 3: 380 µs per loop

In [69]: %timeit df.loc[df['A'] == 'foo']
1000 loops, best of 3: 745 µs per loop

In [71]: %timeit df.loc[df['A'].isin(['foo'])]
1000 loops, best of 3: 562 µs per loop

In [72]: %timeit df[df.A=='foo']
1000 loops, best of 3: 796 µs per loop

In [74]: %timeit df.query('(A=="foo")')  # slowest
1000 loops, best of 3: 1.71 ms per loop

190
задан Aᴍɪʀ 21 December 2016 в 20:09
поделиться

4 ответа

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

var keys = [];
for (var k in h)keys.push(k);
13
ответ дан danb 23 November 2019 в 05:35
поделиться

Для производственного кода, требующего большой совместимости с клиентскими браузерами, я все еще предлагаю, чтобы ответ Ivan Nevostruev выше с контейнером удостоверился 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;
}
<час>

Редактирование: , Так как этот ответ был вокруг некоторое время, я оставлю вышеупомянутое нетронутым. Любой читающий это должен также прочитать ответ Ivan Nevostruev ниже.

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

80
ответ дан Alexander Elgin 23 November 2019 в 05:35
поделиться

Я полагаю, что можно циклично выполниться через свойства использования объекта для/в, таким образом, Вы могли сделать что-то вроде этого:

function getKeys(h) {
  Array keys = new Array();
  for (var key in h)
    keys.push(key);
  return keys;
}
6
ответ дан palmsey 23 November 2019 в 05:35
поделиться

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

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

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

for (var key in h) ...

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

4
ответ дан 23 November 2019 в 05:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: