【问题标题】:how to move an objects in the array after changing key更改键后如何移动数组中的对象
【发布时间】:2016-12-17 09:27:36
【问题描述】:

我有一个数组,其中的对象按“顺序”键排序

[
  {order: 1, id: 1, title: elem1},
  {order: 2, id: 2, title: elem2},
  {order: 3, id: 3, title: elem3},
  {order: 4, id: 4, title: elem4},
  {order: 5, id: 5, title: elem5}
]

将“elem2”中的“order”键更改为“4”后,数组应如下所示

[
  {order: 1, id: 1, title: elem1},  
  {order: 2, id: 3, title: elem3},
  {order: 3, id: 4, title: elem4},
  {order: 4, id: 2, title: elem2},
  {order: 5, id: 5, title: elem5}
]

我想在双向更改某个对象中的键“顺序”后移动数组中的一个对象

【问题讨论】:

  • Array.prototype.sort
  • @Vld - 它更像是“提取”和“插入”操作。项目#3 也在移动。不确定如何通过排序来完成。
  • @Arnauld 通过排序——这就是排序的作用,它按默认或指定规则排列元素。
  • @Arnauld 是认真的,伙计?排序的作用是对东西进行排序objects.sort((a, b) => a.order - b.order)。这个复杂且难以理解的解决方案花了我 5 秒的时间来实施。

标签: javascript arrays sorting object


【解决方案1】:

您可以使用.splice() 移动项目并使用.forEach() 更新order 属性。

var arr = [
  {order: 1, id: 1, title: 'elem1'},
  {order: 2, id: 2, title: 'elem2'},
  {order: 3, id: 3, title: 'elem3'},
  {order: 4, id: 4, title: 'elem4'},
  {order: 5, id: 5, title: 'elem5'}
];

function moveItem(arr, from, to) {
  arr.splice(to - 1, 0, arr.splice(from - 1, 1)[0]);
  arr.forEach(function(e, i) { e.order = i + 1; });
}

moveItem(arr, 2, 4);

// formatted output
console.log(JSON.stringify(arr).split('},').join('},\n'));

【讨论】:

  • 为什么不提供一个排序函数来比较每个元素的 order 属性值?我的意思是,您的方法似乎非常脆弱和不必要,不是吗?还有一个一小时前的工作示例。
  • @DaveNewton 我可能在这里遗漏了一些东西,但我仍然不明白。通过仅排序(就像其他答案一样),项目#3 将保持在相同的位置。这不是 OP 想要的。
  • 公平地说,如果两个订单值相同,则 OP 期望什么并不明确。
  • @DaveNewton 我的理解是OP希望将元素A移动到位置B,将A和B之间的所有元素移向数组的开头,然后更新'order'属性以反映新的安排。
  • (或当 B 在 A 之前时移向数组末尾)
【解决方案2】:

你可以使用Array.prototype.sort()函数:

var elem1, elem2, elem3, elem4, elem5;
var arr = [
  {order: 1, id: 1, title: elem1},
  {order: 2, id: 2, title: elem2},
  {order: 3, id: 3, title: elem3},
  {order: 4, id: 4, title: elem4},
  {order: 5, id: 5, title: elem5}
];

arr[1].order = 4;
arr[3].order = 2;

arr.sort((a, b) => a.order > b.order);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-01-28
    • 2011-10-12
    • 1970-01-01
    • 2021-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多