如何在javascript中避免for循环for循环

Sta*_*y J 6 javascript foreach for-loop

我已经编写了一段工作正常的代码.我想要一个新的数组,该数组由来自myArr的元素按orderArr中指定的顺序组成.但是,它在另一个for循环中使用for循环来匹配数组元素.

var myArr = ['a', 'b', 'c', 'd', 'e'];
var orderArr = ['e', 'c'];
var reArr = [];

for (var i = 0; i < orderArr.length; i++) {
  for (var k = 0; k < myArr.length; k++) {
    if (myArr[k] == orderArr[i]) {
      reArr.push(myArr[k]);
    }
  }
}

console.log(reArr);
Run Code Online (Sandbox Code Playgroud)

我经常听说在另一个for循环中使用for循环是不好的做法,即使每个都应该避免.

我怎么能重写这段代码.

Ori*_*ori 5

在您的情况下,嵌套循环的复杂度为O(n * m)-n的长度orderArr,m的长度myArr

该解决方案的复杂性是O(N + M),因为我们使用创建字典对象阵列#减少与O(米)的复杂性,然后过滤orderArray用O(n)的的复杂性。

注意1:对于小型阵列,这并不重要。因此,除非两个数组中都有数千个数组,否则您可以保留嵌套循环。

注意2:此代码假定中没有重复项myArr。如果存在重复项,则结果将与嵌套循环的结果不同。

var myArr = ['a', 'b', 'c', 'd', 'e'];
var orderArr = ['e', 'c'];
var myArrDict = myArr.reduce(function(r, s) {
  r[s] = true;
  return r;
}, Object.create(null));

var reArr = orderArr.filter(function(s) {
  return this[s];
}, myArrDict);

console.log(reArr);
Run Code Online (Sandbox Code Playgroud)


art*_*kay 5

我并不一定要说在循环内部使用循环是一种不好的做法-实际上,Ori Drori击败了我,指出这种做法的效率可能仅取决于数据集的大小。

例如,排序算法有很多实现,您经常会在循环中找到循环。但是,随着数据大小的变化,实现的细节会影响性能。

我个人的经验是,当我看到嵌套循环时,我立即问自己是否正在执行的操作需要使用其他算法进行优化。在JavaScript(浏览器)应用程序中,答案通常是“否”,因为数据大小很少足够大以至于不会产生重大影响。