为了循环效率,将两个for循环合二为一

时间:2017-03-21 12:19:33

标签: javascript performance for-loop

所以我有2个单独的2D数组,它们不一定是相同的长度,我想为每个制作一个对象。我做了这个:

var obj1 = {},
    obj2 = {};

    for (var i=0; i<arr1.length; i++) {

      obj1[arr1[i][1]] = arr1[i][0];

    }  

    for (var j=0; j<arr2.length; j++) {

      obj2[arr2[j][1]] = arr2[j][0];

    }

我的问题是,是否有办法只用一个循环来实现这个目的。谢谢!

5 个答案:

答案 0 :(得分:3)

您可以尝试这样的事情:

var obj1 = {},
    obj2 = {},
    length = Math.max(arr1.length, arr2.length);  // get max array length

for (var i = 0; i < length; i++) {                // loop max array length

  if (i < arr1.length) {                          // do check for arr1
    obj1[arr1[i][1]] = arr1[i][0];   
  }

  if (i < arr2.length) {                          // do check for arr2
    obj2[arr2[i][1]] = arr2[i][0];
  }
}

As pointed out, this may be less efficient than 2 separate loops

Although it also may be more efficient

答案 1 :(得分:2)

你真正想要的是一个删除复制的函数抽象。没有什么可以使这更有效(如果你的意思是时间复杂性,而不是开发人员效率):

function arrToObj(arr) {
    var obj = {};
    for (var i=0; i<arr.length; i++) {
        obj[arr[i][1]] = arr[i][0];
    }  
    return obj;
}
var obj1 = arrToObj(arr1),
    obj2 = arrToObj(arr2);

循环仍然执行两次,但它只能写一次

答案 2 :(得分:0)

这样的事情应该有效:

var obj1 = {},
    obj2 = {};

for (let i = 0; i < arr1.length && i < arr2.length; i++) {

    obj1[arr1[i][1]] = arr1[i][0];
    obj2[arr2[i][1]] = arr2[i][0];
}

if (arr1.length > arr2.length) {
    for (let i = arr2.length; i < arr1.length; i++) {
        obj1[arr1[i][1]] = arr1[i][0];
    }
}

if (arr2.length > arr1.length) {
    for (let i = arr1.length; i < arr2.length; i++) {
        obj2[arr2[i][1]] = arr2[i][0];
    }
}

答案 3 :(得分:0)

受皮特和欧元答案的启发,我建议这一点:

var commonLength = Math.min(arr1.length, arr2.length);

for (var i = 0; i < commonLength; i++) {
    obj1[arr1[i][1]] = arr1[i][0];
    obj2[arr2[i][1]] = arr2[i][0];
}

for (var i = commonLength; i < arr1.length; i++) {
    obj1[arr1[i][1]] = arr1[i][0];
}

for (var i = commonLength; i < arr2.length; i++) {
    obj2[arr2[i][1]] = arr2[i][0];
}

由于问题是关于效率,我做了一个jsperf test case来比较解决方案。

答案 4 :(得分:-2)

var obj1 = {},   

for (var i=0; i<arr1.length; i++) {

  obj1[arr1[i][1]] = arr1[i][0];

}  

for (var j=0; j<arr2.length; j++, i++) {

  obj2[arr2[i][1]] = arr2[j][0];

}

希望你能