我正在尝试使用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。
答案 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)
答案 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]”的新数组。然后只返回新数组。这应该处理您放入系统的任何映射(您只需要决定是否以及如何处理留空空间和/或覆盖空格的映射)