在JavaScript中优化嵌套的for循环和if语句

时间:2019-04-02 07:10:32

标签: javascript arrays node.js loops object

我的javascript代码中的两个嵌套的for循环中有一个if语句,如下所示。

问题是当我不得不比较数组中的数千个对象时,执行会变慢,因为循环遍历整个数组只是为了检查单个匹配值。

当数据对象中的键与arr数组中的对象的ID匹配时,它将向arr数组中的对象添加用户名键。

请运行以下代码,然后查看输出:

var data = { 1: 'John',
  2: 'Josehp',
  8: 'Marley',
  3: 'George',
  4: 'Stella',
  5: 'Stanley',
  123: 'Juhi'
}



var arr = [ { id: '1'
   },
  { id: '2'
  },
  { id: '10'
    },
  { id: '3'
    },
  { id: '4'
    },
  { id: '13'
    },
  { id: '5'
    }
];

var x;
for (x in data) {
	for (i = 0; i < arr.length; i++) {
	if (arr[i].id == x) {
	arr[i].username = data[x];
	}
     }
  }
console.log(arr)

如何优化此代码以避免嵌套循环或只是提高性能?

7 个答案:

答案 0 :(得分:1)

您可以执行一个循环,然后检查对象是否存在并更新数组。

var data = { 1: 'John', 2: 'Josehp', 8: 'Marley', 3: 'George', 4: 'Stella', 5: 'Stanley', 123: 'Juhi' },
    array = [ { id: '1' }, { id: '2' }, { id: '10' }, { id: '3' }, { id: '4' }, { id: '13' }, { id: '5' }],
    i;

for (i = 0; i < array.length; i++) {
    if (array[i].id in data) {
        array[i].username = data[array[i].id];
    }
}

console.log(array);
.as-console-wrapper { max-height: 100% !important; top: 0; }

答案 1 :(得分:1)

您可以遍历arr数组,并使用相同的键基于data的属性设置每个项目的用户名。

var data = {
  1: 'John',
  2: 'Josehp',
  8: 'Marley',
  3: 'George',
  4: 'Stella',
  5: 'Stanley',
  123: 'Juhi'
};

var arr = [{ id: '1' },
{ id: '2' },
{ id: '10' },
{ id: '3' },
{ id: '4' },
{ id: '13' },
{ id: '5' }];


arr.forEach(function(item) {
  item.username = data[item.id];
});
console.log(arr);

答案 2 :(得分:1)

data是一个以id为键的哈希,因此按id访问其元素是一项O(1)操作。

这意味着您可以在arr变量中进行一个循环,使算法呈线性(O(n)):

for (let i = 0; i < arr.length; i++ )
  if ( data[arr[i].id] )
    arr[i].username = data[arr[i].id]

答案 3 :(得分:1)

您可以使用Array.prototype.mapternary

var data = { 1: 'John',
  2: 'Josehp',
  8: 'Marley',
  3: 'George',
  4: 'Stella',
  5: 'Stanley',
  123: 'Juhi'
}



var arr = [ { id: '1'
   },
  { id: '2'
  },
  { id: '10'
    },
  { id: '3'
    },
  { id: '4'
    },
  { id: '13'
    },
  { id: '5'
    }
];

let out = arr.map(({id}) => (data[id]? {id, username: data[id]}: {id}));
console.log(out)

答案 4 :(得分:1)

只需将 @Override public void onPageSelected(int position) { currentPosition = position; if (countDownTimer != null) { countDownTimer.cancel(); // Most important thing } if (viewPager.getCurrentItem() == 0) { videoPlayPause(0); } if (viewPager.getCurrentItem() == 1) { videoPlayPause(5); } if (viewPager.getCurrentItem() == 2) { videoPlayPause(9); } } 与三元运算符一起使用并扩展:

map
var data = { 1: 'John', 2: 'Josehp', 8: 'Marley', 3: 'George', 4: 'Stella', 5: 'Stanley', 123: 'Juhi'}

var arr = [{id: '1'},{id: '2'},{id: '10'},{id: '3'},{id: '4'},{id: '13'},{id: '5'}];

arr = arr.map(e => data[e.id] ? { ...e, username: data[e.id] } : e);

console.log(arr)

答案 5 :(得分:1)

也许这样会有所帮助?

arr.forEach((user) => {
    if (data[user.id] !== undefined) {
        user.username = data[user.id]
    }
});

答案 6 :(得分:1)

import threading
def change_color():
     while True:
          time.sleep(10)
          color = (random.randint(0,255),random.randint(0,255),random.randint(0,255))
threading.Thread(target=change_color).start()