Сравните 2 списка, чтобы получить движущийся идентификатор + смещение + направление

Я хотел бы сравнить 2 списка и получить 3 переменные: движущийся элемент, смещение, направление.

Пример 1:

Старый список = 121,120,119,43,42,41,40,39,38,37

Новый список = 43,121,120,119,42,41,40,39,38,37

Я перемещаю пункт 43 вверх по списку,

движущийся предмет = 43

offset = 3 (между старой и новой позицией есть 3 элемента)

направление = +1 (при движении вверх)


Пример 2

Старые ниды= 121,120,119,43,42,41,40,39,38,37

Новые ниды= 121,120,119,43,41,40,39,38,37,42

Я перемещаю пункт 42 вниз в конец списка,

движущийся предмет = 42

offset = 5 (между старой и новой позицией есть 5 элементов)

направление = -1 (при движении вниз)


Я использую javascript, чтобы справиться с этим. Какой алгоритм я могу использовать? Или какие подсказки мне искать в гугле? Большое спасибо!


person Sacbmcpd Samuel    schedule 16.11.2014    source источник
comment
Я бы начал с поиска сравнения двух неупорядоченных списков в javascript.   -  person Ryan Hartman    schedule 16.11.2014


Ответы (1)


Вот что-то проверено только на ваших примерах. Возможно, он может указать хотя бы одно возможное направление. (Возможно, я упустил некоторые граничные/особые случаи.)

var a1 = [121,120,119,43,42,41,40,39,38,37],
    b1 = [43,121,120,119,42,41,40,39,38,37],
    a2 = [121,120,119,43,42,41,40,39,38,37],
    b2 = [121,120,119,43,41,40,39,38,37,42];

function f(a,b){
  var item,
      i = offset = 0,
      direction;

  while (a[i] == b[i]){
    i++;
  }

  if (a[i + 1] == b[i]){
    direction = -1;
    item = a[i];
    while (b[i] != item){
      offset++;
      i++;
    }
  } else {
    direction = 1;
    item = b[i];
    while (a[i] != item){
      offset++;
      i++;
    }
  }
  return [item,offset,direction]
}

Выход:

console.log(f(a1,b1))
Array [ 43, 3, 1 ]

console.log(f(a2,b2))
Array [ 42, 5, -1 ]
person גלעד ברקן    schedule 16.11.2014
comment
Кстати, я хотел бы передать старый и новый список на сервер для сравнения. Это связано с тем, что если клиент использует браузер, слишком часто меняя номер сортировки, это приведет к сбою браузера. - person Sacbmcpd Samuel; 16.11.2014
comment
codepen.io/thgreasi/pen/jlkhr и github.com/angular-ui/ui-sortable - person Sacbmcpd Samuel; 16.11.2014