快速有效地切换阵列元素

时间:2016-09-10 22:27:26

标签: javascript arrays

我正在尝试交换这些数组中的数据。

我的数据看起来像这样。在生产中,这个数组可以并且将会大几倍。

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;
}

我想弄清楚的是,这是否是最有效的方法和/或是否可以进行任何改进。

请理解即使是最轻微的改进也很重要。

3 个答案:

答案 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;。

与往常一样,基准测试始终是找出谁更快的好方法:

&#13;
&#13;
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;
&#13;
&#13;

在我的firefox最新版本(Windows 10 x64)中,我得到(非常一致)16到位,而地图版本为350,这意味着你使用地图代替你的<强> 20倍速自己的版本。

您可能认为这是因为此代码段嵌入在iframe中等等,所以我在节点(4.5.0)中运行它,它建立在V8之上,我得到了相同的结果:

enter image description here

我认为抖动不够智能,无法在地图版本中正确内联函数,或者推断它在同一内存上运行而没有副作用。因此,Jitter必须分配一个全新的数组来存储中间结果,然后通过函数调用(在每次迭代时表示寄存器保存/恢复停顿)循环它,然后:

  • 将整个数据复制到arr
  • 移动引用(可能发生的事情),但垃圾收集器必须收集整个临时数组。

map函数也可能触发临时的重新分配,这非常昂贵。