【问题标题】:Reorder array of objects by key with one at a fixed position and update its siblings key通过键对对象数组重新排序,其中一个位于固定位置并更新其兄弟键
【发布时间】:2020-11-25 09:03:18
【问题描述】:

我有一个对象数组,每个对象可以有一个order 属性。现在我想通过更新一个对象的订单号来重新排序这个数组。然后应该更新它的兄弟姐妹,以便它的顺序再次有意义。

基地:

  • 01:没有订单
  • 02:订单 4
  • 03:订单 2
  • 04:无顺序

如果04得到固定位置2的步骤:

第1步
  • 01:订单 0
  • 02:订单 4
  • 03:订单 2
  • 04:无顺序
第2步
  • 01:订单 0
  • 03:订单 2
  • 04:无顺序
  • 02:订单 4
第 3 步
  • 01:订单 0
  • 03:订单 1
  • 04:无顺序
  • 02:订单 4
第四步
  • 01:订单 0
  • 03:订单 1
  • 04:订单 2
  • 02:订单 4
第 5 步
  • 01:订单 0
  • 03:订单 1
  • 04:订单 2
  • 02:订单 3

04 获得1 的固定位置时,02 将位于同一索引上,因此由于04 是固定的02 获取04 旧索引或当前+ 1。

【问题讨论】:

  • 你如何决定03 是被推到订单 1 还是被推到订单 3?您如何决定对具有no order 的元素进行排序?
  • 听起来像是普通的按键排序,还是我错过了什么? stackoverflow.com/q/8837454/5520354
  • @JannesCarpentier 基于他们的索引。 02 被移到末尾,因此 03 得到索引 1 和 04 索引 2。
  • 否 @C14L,因为我想更新所有兄弟姐妹的 order 属性并将 04 的索引保持在 2。

标签: javascript arrays sorting object


【解决方案1】:

我想你想要这样的东西:

  1. 您更新元素的顺序
  2. 您对它们进行排序
  3. 您更新订单值

const data = [{
  i: 1,
  order: "no order"
}, {
  i: 2,
  order: 4
}, {
  i: 3,
  order: 2
}, {
  i: 4,
  order: "no order"
}];

function printData() {
  data.forEach(x => console.log(x.i, x.order));
}

function changeOrderAndSort(index, order) {
  data[index].order = order;
  printData();

  data.sort((a, b) => a.order - b.order);
  console.log("--")
  printData();

  for (let i = 0; i < data.length; i++) {
    data[i].order = i;
  }
  console.log("--")
  printData();
}

changeOrderAndSort(3, 2);

【讨论】:

  • 效果很好,谢谢。刚刚注意到给3 一个0 的索引是行不通的。将尝试以此为基础。
  • 那是因为我只是改变了它的订单价值,而不是把它放在某个索引上。带有order: "no order" 的对象也不会被排序函数移动。
猜你喜欢
  • 2017-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多