【问题标题】:How to run the loop inside the loop faster in javascript如何在javascript中更快地运行循环内的循环
【发布时间】:2015-12-17 12:36:35
【问题描述】:

我有两个长度不同的数组对象,其中data.rows 的长度为 955,place_names 的长度为 287。我在循环内运行循环,大约需要 3 分钟才能运行。有没有什么简单快捷的方法可以运行下面的代码?

for (i = 0; i < place_names.length; i++) {
  for (j = 0; j < data.rows.length; j++) {
    if (place_names[i].name === data.rows[j].name) {
      geom.push(data.rows[j].st_asgeojson);
      geom1.push({
        name: data.rows[j].name,
        geometry: data.rows[j].st_asgeojson
      });
      matched_average_value.push(place_names[i].average);
      matched_sum_value.push(place_names[i].sum);
      matched_minimum_value.push(place_names[i].minmum);
      matched_maximum_value.push(place_names[i].maximum);
    }
    else {
      console.log("no matches found");
    }
  }
}

【问题讨论】:

  • 你可以试试这个并比较一下。但我认为这不会有太大的不同。小提琴:jsfiddle.net/xoowvcf9
  • ij 局部变量吗?您可以按名称对两个列表进行排序。
  • @Haketo,排序将经过另一个循环,对吗?但这不会是嵌套的。有点帮助!我想你也需要在某个地方打破一个循环。 if (place_names[i].name === data.rows[j].name) 在这里?
  • @RayonDabre 排序将允许在到达最后一个匹配项时停止内部循环,您可以在最后一个匹配项开始内部循环。
  • 删除console.log ...你有它会导致多达274000+无意义的console.logs

标签: javascript for-loop nested-loops


【解决方案1】:

您有两个列表 place_namesdata.rows。您感兴趣的字段是name 字段。

根据您从哪里获取这些数据,最好使用字典:

var dict = {};
place_names.forEach(
    function(place_name) {
        dict[place_name.name]=place_name;
    }
);

现在您可以循环访问您的data.rows

data.rows.forEach(
    function(row) {
        if(row.name in dict) {
            var place_name = dict[row.name];
            // Do what needs to be done with "row" and "place_name"
        }
    }
);

这应该将您的 n^2 算法减少到 n log n 甚至 n(取决于 JavaScript 的字典索引复杂性,我不确定)。此解决方案假定所有place_names[i].name 值都是唯一。如果不是,那么您可能希望在您的dict 中存储所有匹配place_names 的列表。

【讨论】:

    猜你喜欢
    • 2022-07-26
    • 1970-01-01
    • 2019-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多