Javascript круговой массив найти следующий элемент - PullRequest
2 голосов
/ 13 марта 2019

У меня есть массив из n элементов.Я нахожусь в заданной позиции, скажем, х, и мне нужно переместиться в позицию у, мне нужно выяснить, в чем разница или количество шагов, если я пересекаю массив, идя вперед и назад.

const foo = Array.from(Array(15).keys());
const length = foo.length;
const currentItem = 2;
const next = 12;
let diff = currentItem - next;
if (diff < 0) {
  if (next > currentItem) {
    diff = next - currentItem;
    console.log((diff));
  } else {
    diff = length - Math.abs(diff);
    console.log(-diff);
  }
} else {
  if (next < currentItem) {
    console.log(-(diff));
  } else {
    console.log(diff);
  }
}

Я пытаюсь найти в приведенном выше коде, если мне нужно двигаться вперед или назад.В приведенном выше примере я ожидаю ответа как -6, но я получаю ответ 10. Я немного запутался в циклах.Есть ли лучший и умный способ сделать это?

1 Ответ

3 голосов
/ 13 марта 2019

Вот как я это сделаю:

// The % operator in JavaScript is the remainder operator.
// The following function defines the modulo operator.
const mod = (x, y) => (x % y + y) % y;

// Law: mod(start + shortestPath(start, end, length), length) === end
const shortestPath = (start, end, length) => {
    const forward  = mod(end - start, length);
    const backward = mod(start - end, length);
    return forward > backward ? -backward : forward;
};

const shortestPathLaw = (start, end, length) =>
    mod(start + shortestPath(start, end, length), length) === end;

console.assert(shortestPathLaw(4, 6, 10));
console.assert(shortestPathLaw(8, 6, 10));

console.log(shortestPath(4, 6, 10)); // 2
console.log(shortestPath(8, 6, 10)); // -2

Мы используем оператор по модулю для вычисления прямого расстояния от точки A до точки B (т. Е. B - A).Расстояние назад от точки A до точки B такое же, как расстояние вперед от точки B до точки A (то есть A - B).Затем мы выбираем меньшее из двух расстояний, и если расстояние, которое мы выбрали, является обратным расстоянием, то мы отрицаем его, чтобы показать, что мы едем назад от А, чтобы достичь B.

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