Задать вопрос
@vlados096zver

Как избежать в выводе 5?

ведь она по сути "не сдвинутась"
только 6 и 4
function getMoveMessages(appliedList, draftList) {
  const getId = r => (r.rule_id ?? r.id).toString();

  const appliedPosMap = new Map();
  appliedList.forEach((r, idx) => appliedPosMap.set(getId(r), idx + 1));

  const draftPosMap = new Map();
  draftList.forEach((r, idx) => draftPosMap.set(getId(r), idx + 1));

  const messages = [];

  draftList.forEach(r => {
    const id = getId(r);
    const appliedPos = appliedPosMap.get(id);
    const draftPos = draftPosMap.get(id);

    if (appliedPos !== draftPos) {
      // Если правило сместилось с исходной позиции
      if (appliedPos < draftPos) {
        messages.push({ id: r.id, msg: `Rule moved to line ${draftPos}` });
      } else if (appliedPos > draftPos) {
        messages.push({ id: r.id, msg: `Rule moved from line ${appliedPos}` });
      }
    }
  });

  return messages;
}

const appliedList = ["7","6","5","4","3","2","1"].map(n => ({id:n, rule_id:null}));
const draftList   = ["7","5","4","6","3","2","1"].map(n => ({id:n, rule_id:null}));

console.log(getMoveMessages(appliedList, draftList));
  • Вопрос задан
  • 143 просмотра
Подписаться 1 Простой 3 комментария
Помогут разобраться в теме Все курсы
  • Нетология
    Веб-разработчик с нуля: профессия с выбором специализации
    14 месяцев
    Далее
  • Академия Эдюсон
    Fullstack-разработчик на JavaScript
    11 месяцев
    Далее
  • Skillbox
    JavaScript
    3 месяца
    Далее
Пригласить эксперта
Ответы на вопрос 1
opium
@opium
Просто люблю качественно работать
тут классическая проблема: по двум массивам нельзя отличить кто «реально» двинулся а кто просто подвинулся. стандартный подход — longest common subsequence между списками, всё что не попало в LCS то и перемещалось. у тебя LCS это [7,5,4,3,2,1], значит двигалась только 6.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы