重新排序数组

IT技术 javascript arrays sorting
2021-02-16 23:54:45

说,我有一个看起来像这样的数组:

var playlist = [
    {artist:"Herbie Hancock", title:"Thrust"},
    {artist:"Lalo Schifrin", title:"Shifting Gears"},
    {artist:"Faze-O", title:"Riding High"}
];

如何将元素移动到另一个位置?

例如,我想移动{artist:"Lalo Schifrin", title:"Shifting Gears"}到最后。

我尝试使用 splice,如下所示:

var tmp = playlist.splice(2,1);
playlist.splice(2,0,tmp);

但它不起作用。

6个回答

的语法Array.splice是:

yourArray.splice(index, howmany, element1, /*.....,*/ elementX);

在哪里:

  • index是您要开始从中删除元素的数组中的位置
  • howmany是您要从索引中删除的元素数量
  • element1, ..., elementX是您要从位置index插入的元素

这意味着splice()可用于删除元素、添加元素或替换数组中的元素,具体取决于您传递的参数。

请注意,它返回一个已删除元素的数组。

好的和通用的东西是:

Array.prototype.move = function (from, to) {
  this.splice(to, 0, this.splice(from, 1)[0]);
};

然后只需使用:

var ar = [1,2,3,4,5];
ar.move(0,3);
alert(ar) // 2,3,4,1,5

图表:

算法图

这是一个很好的答案, splice() 中的 splice() 可以很好地完成工作。但是,应该注意的是,将 move() 方法添加到 Array 原型称为“Monkey Patching”,通常被认为是不好的做法。 stackoverflow.com/questions/5741877/...
2021-04-29 23:54:45
使用 splice() 似乎很棘手有一些难以解决的边缘情况 - 即一次重新排序两个以上项目的情况。
2021-05-11 23:54:45

如果您知道索引,则可以使用如下简单的函数轻松交换元素:

function swapElement(array, indexA, indexB) {
  var tmp = array[indexA];
  array[indexA] = array[indexB];
  array[indexB] = tmp;
}

swapElement(playlist, 1, 2);
// [{"artist":"Herbie Hancock","title":"Thrust"},
//  {"artist":"Faze-O","title":"Riding High"},
//  {"artist":"Lalo Schifrin","title":"Shifting Gears"}]

数组索引只是数组对象的属性,因此您可以交换其值。

谢谢,@CMS。如果我交换平均值不想替换订单...例如,如果我选择第 3 个对象到第一个位置,我想将 1 交换为 2,将 2 交换为 3 为 1
2021-05-07 23:54:45

对于感兴趣的人,这是一个不可变的版本:

function immutableMove(arr, from, to) {
  return arr.reduce((prev, current, idx, self) => {
    if (from === to) {
      prev.push(current);
    }
    if (idx === from) {
      return prev;
    }
    if (from < to) {
      prev.push(current);
    }
    if (idx === to) {
      prev.push(self[from]);
    }
    if (from > to) {
      prev.push(current);
    }
    return prev;
  }, []);
}
谢谢两位的解释
2021-04-19 23:54:45
嗨,你能向我解释一下这个功能对上面答案的好处吗?
2021-04-22 23:54:45
此解决方案不会修改原始元素,而是返回一个新数组,其中包含正在移动的条目。
2021-05-03 23:54:45
@Xogno 在像 React 这样的框架中特别有用,这些框架通常需要不可变的对象来检测更改
2021-05-13 23:54:45

使用ES6,您可以执行以下操作:

const swapPositions = (array, a ,b) => {
  [array[a], array[b]] = [array[b], array[a]]
}

let array = [1,2,3,4,5];
swapPositions(array,0,1);

/// => [2, 1, 3, 4, 5]
这交换了两个元素的位置。问题是重新排序。
2021-04-27 23:54:45

如果您不知道当前记录在哪里,您总是可以使用 sort 方法:

playlist.sort(function (a, b) {
    return a.artist == "Lalo Schifrin" 
               ? 1    // Move it down the list
               : 0;   // Keep it the same
});
关于什么 return +(a.artist == "Lalo Schifrin")
2021-05-03 23:54:45
@Funko 你可以这样做,如果你更喜欢简洁而不是冗长。
2021-05-06 23:54:45