Более быстрые результаты могут быть достигнуты с помощью 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
Это является лучшим, можно сделать, насколько я знаю...
var keys = [];
for (var k in h)keys.push(k);
Для производственного кода, требующего большой совместимости с клиентскими браузерами, я все еще предлагаю, чтобы ответ 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
. Я все еще думаю, что этот ответ был бы идеален, если расширение прототипа Объекта не было так грязно.
Я полагаю, что можно циклично выполниться через свойства использования объекта для/в, таким образом, Вы могли сделать что-то вроде этого:
function getKeys(h) {
Array keys = new Array();
for (var key in h)
keys.push(key);
return keys;
}
Я хотел использовать ответ с наивысшим рейтингом выше
Object.prototype.keys = function () ...
Однако при использовании в сочетании с API google maps v3, google maps не функционирует.
for (var key in h) ...
работает хорошо.