Алгоритм переиндексации массива объектов после вставки или перетаскивания с изменением порядка удаления - PullRequest
5 голосов
/ 08 марта 2011

Предположим, у меня есть индексированный массив объектов, таких как строки, содержащие популярную народную песню;)

var lyrics = [
  {line : 2, words : "He's a lumberjack and he's okay"},
  {line : 1, words : "I'm a lumberjack and I'm okay"},
  {line : 3, words : "He sleeps all night and he works all day"}
];

Мой компаратор отобразит объекты в представлении в соответствии с индексом каждого объекта. Я хочу иметь возможность выполнять три задачи в этом массиве:

Задание 1) Переиндексировать при перетаскивании

Изменение порядка объектов с помощью перетаскивания. Предположим, я уже знаю, как реализовать перетаскивание. Пример задачи: перетащите «Он дровосек, и он в порядке» из индекса «1» в после «Я дровосек, и я в порядке». «Он дровосек, и он в порядке» теперь должен занимать индекс «2», а «Я дровосек и все в порядке» должен занимать индекс «1». Полученный массив должен быть:

var lyrics = [
  {line : 1, words : "I'm a lumberjack and I'm okay"},
  {line : 2, words : "He's a lumberjack and he's okay"},
  {line : 3, words : "He sleeps all night and he works all day"}
];

Задание 2) Переиндексировать при вставке

Добавить объект в любую точку массива, переиндексировать все элементы в массиве. Пример задачи: добавить объект «Я сплю всю ночь и работаю весь день» в качестве второго элемента в массиве. Полученный массив должен быть:

var lyrics = [
  {line : 1, words : "I'm a lumberjack and I'm okay"},
  {line : 2, words : "I sleep all night and I work all day"},
  {line : 3, words : "He's a lumberjack and he's okay"},
  {line : 4, words : "He sleeps all night and he works all day"}
];

Задача 3) Переиндексировать при удалении

Удалить объект из массива и переиндексировать все элементы в массиве. Так, например, если объект с индексом «3» был удален, результирующий массив должен быть:

var lyrics = [
  {line : 1, words : "I'm a lumberjack and I'm okay"},
  {line : 2, words : "I sleep all night and I work all day"},
  {line : 3, words : "He sleeps all night and he works all day"}
];

У меня нет степени CS, поэтому я немного озадачен тем, какой алгоритм поможет мне справиться с этим. Может ли кто-нибудь указать мне правильное направление?

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

1 Ответ

10 голосов
/ 08 марта 2011

Я бы полностью упростил всю вашу структуру:

Используйте собственный массив javascript вместо хранения дополнительного ключа (line), используйте индекс javascript в качестве ключа, что означает javascript (если используется правильно)будет управлять вами и использовать меньше памяти.

Итак, у нас есть массив строк:

var f = [];
f.push('first');
f.push('third');
f.push('fourth');

// reindex on insert
// lets insert second in the natural place

f.splice(1,0,'second'); // ["first", "second", "third", "fourth"]

// reindex on delete
// lets delete 'third'

f.splice(2,1); // ["first", "second", "fourth"]

и т. д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...