Порядок свойств в нормальных объектах является сложным объектом в Javascript.
Пока в ES5 явно не указан порядок, ES2015 имеет порядок в определенных случаях. Это следующий объект:
o = Object.create (null, {m: {value: function () {}, enumerable: true}, "2": {value: "2 ", перечисляемое: true}," b ": {value:" b ", enumerable: true}, 0: {значение: 0, перечислимое: true}, [Symbol ()]: {значение:" sym ", перечислимое: true}, "1": {value: "1", enumerable: true}, "a": {значение: "a", перечислимое: true},});
Это приводит к следующему порядку (в некоторых случаях):
Объект {0: 0, 1: "1", 2: "2" , b: "b", a: "a", Symbol (): "sym"}
Таким образом, существует три сегмента, которые могут изменить порядок вставки (как это было в примере).
Вопрос в том, какие методы этот порядок гарантирован в спецификации ES2015?
Следующие методы гарантируют показанный порядок:
Следующие методы / петли не гарантируют никакого порядка:
Вывод: даже в ES2015 вы не должны полагаться на порядок свойств нормального объектов в Javascript. Он подвержен ошибкам. Вместо этого используйте Map
.
Обычный шаблон здесь похож на сортировку по атрибуту, украшение, управление и undecorate. Поэтому в этом случае вам просто нужно украсить, а затем позвонить. Однако вы бы хотели избежать этого, так как украшение будет O (n), тогда как вы хотите, чтобы это было O (logn). Поэтому я бы лучше рассмотрел ваш метод.
Что вы можете сделать, это
class OffsetWithAttributes( object ):
def __init__( self, offset, **kw ):
self.offset= offset
self.attributes= kw
def __eq__( self, other ):
return self.offset == other.offset
def __lt__( self, other ):
return self.offset < other.offset
def __le__( self, other ):
return self.offset <= other.offset
def __gt__( self, other ):
return self.offset > other.offset
def __ge__( self, other ):
return self.offset >= other.offset
def __ne__( self, other ):
return self.offset != other.offset
Это должно позволить вам создать простой list
экземпляров OffsetWithAttributes
. Алгоритм bisect
должен быть полностью счастлив использовать определенные операторы.
Вы можете использовать свой someOWA.attributes['data']
.
Или
def __getattr__( self, key ):
return self.attributes[key]
Это должно сделайте OffsetWithAttributes
больше похожим на dict
.
Когда вы говорите, что реальные данные могут быть намного длиннее, это мешает вам хранить список значений смещения под рукой?
offset_values = [i['offset'] for i in test_data]
bisect.bisect(offset_values, 1900)
Ваш метод кажется мне хорошим.