ryuryu1010
@ryuryu1010

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

ソートについて

このようなdrag and dropでできるsortがあるのですが、いまのままだと、4から0のところに持っていくと、4は0になりますが、0は4になり非常に変になります。
どのようにして解決できますでしょうか?
a[oldIndex].order = newIndex;が動かした数字が最新の数になるものなのですが、この動かす側は問題ないですが、別のものはずれてしまいます。
コメントアウトしているところも色々試しましたがうまく行かなかったです。
スクリーンショット 2022-01-18 18.21.17.png

const onSortEnd = ({ oldIndex, newIndex }) => {
    if (oldIndex !== newIndex) {
      const a = [...leftTableData];
      console.log('befiore items: ', a, oldIndex, newIndex);
      a[oldIndex].order = newIndex;
      a[newIndex].order = oldIndex;
      // if (newIndex < oldIndex) {
      //   const filter1 = a.filter((i) => (i.order as number) < oldIndex);
      //   for (let i = 0; i < filter1.length; i += 1) {
      //     if (filter1[i].order === newIndex) {
      //       (filter1[i].order as number) = 0;
      //     } else {
      //       (filter1[i].order as number) += 1;
      //     }
      //   }
      //   // a[newIndex].order = newIndex + 1;
      // }
      // if (newIndex > oldIndex) {
      //   a[newIndex].order = newIndex - 1;
      // }

      console.log('befiore 1 items: ', leftTableData, oldIndex, newIndex);
      const newData = arrayMoveImmutable(
        ([] as MockType[]).concat(a),
        oldIndex,
        newIndex,
      ).filter((el) => !!el);

      console.log('befiore 2 items: ', newData, oldIndex, newIndex);

      setLeftTableData(newData);
    }
  };
0

1Answer

これは、結構面倒臭いですね。4から0のところまで持っていったら、
0を1に、
1を2に、
2を3に、
3を4に、
しないといけません。0~3の所を1ずつ増やせばよいわけです。

0を4の所にしたときは、1~4の所を1ずつ減らす必要があります。

いや、そもそもa変数には、indexの順番に入っているようです。
a変数の列の中のoldIndex番目の要素をnewIndex番目に移動(正確には除いてから挿入)してしまって、そのあとで、.orderを正しいindexに合わせて更新する方が確実そうです。

1Like

Your answer might help someone💌