1

我正在尝试使用 jQuery 对一些元素的排序进行动画处理,并且我的排序图定义如下:

var mapping = [
  [0, 5],
  [1, 4],
  [2, 3],
  [3, 2],
  [4, 1],
  [5, 0]
];

mapping[0][0]是元素的索引并且mapping[0][1]是目标索引。

我的解决方案基本上是这样的:

var elements = [1, 2, 3, 4, 5, 6];

for (var i = 0; i < elements.length; i++) {
  var clone1 = elements[mapping[i][0]];
  var clone2 = elements[mapping[i][1]];

  elements[mapping[i][0]] = clone2;
  elements[mapping[i][1]] = clone1;
}

console.log(elements);

问题是,我正在处理我正在修改的对象,并且这些操作会自行撤消;我没有反转数组,而是返回相同的数组。

我如何在 JavaScript 中交换这样的元素?这是代码的JSFiddle 示例

4

6 回答 6

2
// [source, target]
var mapping = [
  [0, 5],
  [1, 4],
  [2, 3],
  [3, 2],
  [4, 1],
  [5, 0]
];

var elements = [1, 2, 3, 4, 5, 6];

function swapElements(elements, mapping) {
    var tmp = new Array(elements.length);
    for(var i = 0, l = mapping.length; i < l; i++) {
        tmp[mapping[i][1]] = elements[mapping[i][0]];
    }
    for(var i = 0, l = elements.length; i < l; i++) {
        elements[i] = tmp[i];
    }
}

swapElements(elements, mapping);

console.log(elements);​
于 2012-05-22T08:00:33.850 回答
1

访问器功能的一些功能乐趣

var at = function(arr) { return function(i) { return arr[i] } };
[5,4,3,2,0,1].map( at(['a','b','c','d','e','f']) )

这将返回 ['f','e','d','c','a','b']

于 2014-07-25T19:37:22.753 回答
0

您从 0 到 5 和从 5 到 0 再次交换元素两次 :) 尝试

for (var i = 0; i < elements.length / 2; i++)

会没事的。

看这里

于 2012-05-22T07:53:18.250 回答
0

您在循环期间更改数组。每对交换两次,所以结果是一样的。您可能需要另一个 arr 来存储映射值:

var result = [];
for(var i = 0; i<mapping.length; i++){
    result[mapping[i][0]] = elements[mapping[i][1]];
}
console.log(result);
于 2012-05-22T07:55:52.437 回答
0

只需定义一个临时数组:

var elements = [1, 2, 3, 4, 5, 6];
var temp = [];
for (var i = 0; i < elements.length; i++) {
  temp.push(elements[mapping[i][1]]);
}
elements = temp;
于 2012-05-22T07:55:59.513 回答
0

如果您只是想反转列表,Just_Mad 的答案是正确的。但是,如果您希望能够处理任何映射配置,您将需要一种不同的方法。

如果您不关心内存空间,您可以遍历映射列表并将索引“mapping [i] [0]”处的元素复制到索引“mapping [i] [1]”处的新数组。然后只需返回新数组。这应该处理您放入系统的任何映射(您只需决定是否以及如何处理留下空白和/或覆盖空格的映射)

于 2012-05-22T08:18:59.083 回答