2

之前关于如何更新数组顺序的帖子之后。我遵循了 Michael Best 的建议,并使用 splice() 在按钮单击时修改了我的数组的顺序

self.moveup = function (itemIndex) {
    var i = self.itemList.indexOf(itemIndex); 
    if(i >= 1){
     var array = self.itemList();
        self.itemList.splice(i-1, 2, array[i], array[i-1]);
    } 

我遇到麻烦的地方是增加数组中的项目。从阅读 Array Splice 的用法第一个参数指示向上移动应该发生的变化我认为会是i+1,值 2 表示数组中有多少项会改变,所以那里没有变化,然后我认为的范围是当我增加位置时,所选项目数组 [i] 和结尾将是 [i+1]。

self.itemList.splice(i+1, 2, array[i], array[i+1]);

在附加的提琴手中,您可以看到值增加,但项目实际上并未更改顺序,它们仅在您按下向下按钮时才会复制。我希望结果与调用 moveUp 时的结果相同。

我会很感激任何关于我在这里缺少的东西的指示。http://jsfiddle.net/rlcrews/SCWmk/5/

-干杯

4

1 回答 1

7

差不多好了。这就是我的做法。

向上移动项目时,您需要将其与上一个项目交换。因此,您需要分别用i-1和替换索引处的元素。您的方法正是这样做的,所以一切都很好。iarray[i]array[i-1]moveup

现在,当向下移动一个项目时,您需要将其与下一个项目交换。因此,您分别用i和替换索引处的元素。但是,您的代码会更改元素和,这是不好的。相反,您应该这样做:i+1array[i+1]array[i]i+1i+2

self.itemList.splice(i, 2, array[i+1], array[i]);

您开始拼接i(当您删除 and 的元素时i)并用andi+1替换它们(在该索引处插入)。array[i+1]array[i]

另一方面,您对是否可以将项目向下移动的检查是不正确的。唯一不应该向下移动的项是最后一项,即 index 处的元素self.itemList().length-1。因此,支票应该看起来像if (i < array.length - 1) { ... }(见小提琴)。

于 2013-06-17T15:52:05.480 回答