JavaScript:按索引交换数组值

时间:2012-05-22 07:44:52

标签: javascript arrays swap

我正在尝试使用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 example

6 个答案:

答案 0 :(得分:1)

// [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);​

答案 1 :(得分: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']) )

这将返回[&#39; f&#39;,&#39;&#39; d&#39;,&#39; c&#39;&#39; a&#39; ;,&#39; b&#39]

答案 2 :(得分:0)

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

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

没关系。

Look here

答案 3 :(得分:0)

您正在循环播放它。并且每对交换两次,结果是相同的。您可能需要另一个arr来存储映射值:

var result = [];
for(var i = 0; i<mapping.length; i++){
    result[mapping[i][0]] = elements[mapping[i][1]];
}
console.log(result);

答案 4 :(得分: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;

答案 5 :(得分:0)

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

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