所以我有 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];
}
我的问题是是否有办法只用一个循环来实现这一点。谢谢!
你可以尝试这样的事情:
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];
}
}
如前所述,这可能低于 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);
循环仍执行两次,但只写入一次。
这样的事情应该可以工作:
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];
}
}
受到Pete和eur00t的回答的启发,我建议这样做:
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测试用例来比较解决方案。
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];
}
希望你会这样