我正在尝试交换这些数组中的数据。
我的数据看起来像这样。在生产中,这个数组可以并且将会大几倍。
var data = [
[13.418946862220764, 52.50055852688439],
[13.419011235237122, 52.50113000479732],
[13.419756889343262, 52.50171780290061],
[13.419885635375975, 52.50237416816131],
[13.420631289482117, 52.50294888790448]
]
目前我的切换代码如下所示。
var temp;
for(var i = 0;i < data.length;i++) {
temp = array[i][0];
array[i][0] = array[i][1];
array[i][1] = temp;
}
我想弄清楚的是,这是否是最有效的方法和/或是否可以进行任何改进。
请理解即使是最轻微的改进也很重要。
答案 0 :(得分:3)
我会使用更实用的方法:
var switched = data.map(function (arr) {
return [arr[1], arr[0]];
});
如果您使用ES2015,您甚至可以在一行中执行此操作:
const switched = data.map((arr) => [arr[1], arr[0]]);
答案 1 :(得分:0)
如果你想坚持循环:
for(var i = 0; i < data.length; i++) {
data[i] = [data[i][1], data[i][0]];
}
答案 2 :(得分:0)
您的代码看起来非常好,而且您不需要进一步优化&#34;。
与往常一样,基准测试始终是找出谁更快的好方法:
var arr = (function() {
var res = [];
for(var i = 0; i < 100000; ++i) {
res[i] = [Math.random(), Math.random()];
}
return res;
}());
var swap_in_place = function() {
for(var i = 0; i < arr.length; ++i) {
var tmp = arr[i][0];
arr[i][0] = arr[i][1];
arr[i][1] = tmp;
}
};
var swap_map = function() {
arr = arr.map(function(elem) {return [elem[1], elem[0]]; });
};
var runBench = function(name, f) {
var start = new Date().getTime();
for(var i = 0; i < 50; ++i) {
f();
}
var stop = new Date().getTime();
console.log(name + " took: " + (stop - start));
};
runBench("in_place", swap_in_place);
runBench("map", swap_map);
&#13;
在我的firefox最新版本(Windows 10 x64)中,我得到(非常一致)16到位,而地图版本为350,这意味着你使用地图代替你的<强> 20倍速自己的版本。
您可能认为这是因为此代码段嵌入在iframe中等等,所以我在节点(4.5.0)中运行它,它建立在V8之上,我得到了相同的结果:
我认为抖动不够智能,无法在地图版本中正确内联函数,或者推断它在同一内存上运行而没有副作用。因此,Jitter必须分配一个全新的数组来存储中间结果,然后通过函数调用(在每次迭代时表示寄存器保存/恢复停顿)循环它,然后:
arr
map函数也可能触发临时的重新分配,这非常昂贵。