一尘不染

在插入或拖动'n'放置顺序更改后重新索引对象数组的算法

algorithm

假设我有一个带索引的对象数组,例如其中包含流行民歌的歌词;)

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"}
];

我没有计算机科学学位,所以我对哪种算法可以帮助我解决这个问题感到困惑。有人可以指出我正确的方向吗?

我正在使用javascript,因此,如果有人知道做上述事情的任何事情,我将不胜枚举。


阅读 164

收藏
2020-07-28

共1个答案

一尘不染

我会完全简化您的整个结构:

使用本机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"]

等等

2020-07-28