2014-10-02 2 views
0

Я ищу способ собрать кучу объектов JSON и сохранить их в структуре данных, которая позволяет быстро найти и быстро манипулировать, что может изменить положение в структуре для конкретного объект.Эффективная сортированная структура данных в JavaScript

Пример объекта:

{ 
    name: 'Bill', 
    dob: '2014-05-17T15:31:00Z' 
} 

Учитывая сортировать по названию по возрастанию и д.р. убыванию, как бы вы о хранении объектов, так что если у меня есть новый объект для вставки, я знаю, очень быстро, где в структуру данных, чтобы разместить ее так, чтобы позиция объекта была сопоставлена ​​с другими объектами?

С точки зрения поиска, мне нужно уметь сказать: «Дайте мне объект с индексом 12», и он быстро его потянет.

Я могу изменить объекты, чтобы включить данные, которые были бы полезны, например, сохранение текущего положения индекса и т. Д. В свойстве, например. {_indexData: {someNumber: 23, someNeighbour: Object}}, хотя я бы предпочел не делать этого.

Я посмотрел на b-деревья и думаю, что это, скорее всего, будет ответом, но не знал, как реализовать использование нескольких аргументов сортировки (name: ascending, dob: downcending), если я не реализовал два дерева?

У кого-нибудь есть хороший способ решить это?

+0

Предполагая, что вы не добавляете свойство index, как бы вы знали, какой индекс использовать при извлечении записей? – Johan

+0

@Johan В точке ввода Я думаю, мне нужен индекс, который он дал, если я вставляю a, c и b, a === index 0, b === 1 и c === 2. Альтернативно после вставки если структура может быть сплющена к массиву, я могу сделать indexOf(), чтобы найти текущий индекс, хотя он будет использовать линейный поиск, чтобы он не был таким эффективным. –

+0

Если вы действительно обеспокоены сложностью поиска, я думаю, что простой объект с индексом как ключи будет быстрее, чем 'indexOf',' for' и т. Д. В массиве. – Johan

ответ

0

Первое, что вам нужно сделать, это сохранить все объекты в массиве. Это будет вашим лучшим выбором с точки зрения поиска, если вы хотите «Дайте мне объект по индексу 12», вы можете легко получить доступ к этому объекту, например data[11]

Теперь, приступив к их хранению и сортировке, рассмотрим, что у вас есть следующий массив из этих объектов:

var data = [{ 
    name: 'Bill', 
    dob: '2014-05-17T15:31:00Z' 
}, 
{ 
    name: 'John', 
    dob: '2013-06-17T15:31:00Z' 
}, 
{ 
    name: 'Alex', 
    dob: '2010-06-17T15:31:00Z' 
}]; 

следующая простая функция (берется из here) поможет вам в их сортировки на основе их свойств:

function sortResults(prop, asc) { 
    data = data.sort(function(a, b) { 
     if (asc) return (a[prop] > b[prop]); 
     else return (b[prop] > a[prop]); 
    }); 
} 

Первый параметр - это имя свойства, которое вы хотите отсортировать, например. 'name', а второй - логическое возрастание сортировки, если false, оно сортируется по убыванию.

Следующий шаг, вам нужно вызвать эту функцию и дать нужные значения:

sortResults('name', true); 

и Wola! Теперь ваш массив отсортирован по возрастанию имен w.r.t. Теперь вы можете получить доступ к объектам, таким как данные [11], так же, как вы хотели получить к ним доступ, и они также отсортированы.

Вы можете поиграть с примером HERE. Если я пропустил что-либо или не смог правильно понять вашу проблему, не стесняйтесь объяснять, и я подберу свое решение.

EDIT: Повторяя ваш вопрос, я думаю, что пропустил это динамически добавляя бит объектов. С моим решением вам придется называть функцию sortResults каждый раз, когда вы добавляете объект, который может стать дорогим.

+0

Эй, спасибо за это. Yup основной вид массива - это легкий бит, хотя ваше решение сортируется только по имени, а не по dob. Сложная часть этого процесса обрабатывает сортировку против нескольких свойств как по возрастанию, так и по убыванию, а также не сортирует каждый раз каждый новый элемент ... –

+0

да .. понял это позже. Для этого вы правы какого-то дерева или почему вы не идете на хеширование? –

Смежные вопросы