【问题标题】:Javascript array group on specific elements in for loopfor循环中特定元素的Javascript数组组
【发布时间】:2016-02-25 21:38:19
【问题描述】:

我目前有一些代码显示一些基于 MySQL 查询的 html。在我当前的查询中,我只选择带有MAX(ID)(每个数组元素中的第一项)的不同行。我现在正在寻找扩展它,我的数组现在看起来像这样:

var fullcheckins = [["3835","101 Pub","40.8684","-74.0223"],
                    ["2182","101 Pub","40.8684","-74.0223"],
                    ["2181","101 Pub","40.8684","-74.0223"],
                    ["1574","101 Pub","40.8684","-74.0223"],
                    ["1573","101 Pub","40.8684","-74.0223"],
                    ["1572","101 Pub","40.8684","-74.0223"],
                    ["1269","101 Pub","40.8684","-74.0223"],
                    ["1230","101 Pub","40.8684","-74.0223"],
                    ["221","101 Pub","40.8684","-74.0223"],
                    ["220","101 Pub","40.8684","-74.0223"],
                    ["697","113th St. Beach, LBI","39.5938","-74.2145"],
                    ["2838","14th Star Brewery and Taproom","44.8145","-73.0817"],
                    ["2844","14th Star Brewing Co","44.8201","-73.0854"],
                    ["2842","14th Star Brewing Co","44.8201","-73.0854"],
                    ["2841","14th Star Brewing Co","44.8201","-73.0854"],
                    ["2840","14th Star Brewing Co","44.8201","-73.0854"]];

我想要的是某种方法来分隔每一行,其中 fullcheckins 中的每个元素都是相同的,并将它们组合在一起。如果有帮助,则数组是有序的。这是我所期待的:

for (var i = 0; i < checkins.length; i++) {
  var checkin = checkins[i];
  var htmlscript = '<div id="slideShowImages">'
  for each time checkin[2] is the same:
      htmlscript += '<img src="pictures/'+checkin[0]+'.jpg"/>'
  htmlscript += '</div>'

最后,我应该使用多个 htmlscript 变量多次遍历 for 循环,如下所示:

  htmlscript = '<div id="slideShowImages">
                  <img src="pictures/3835.jpg"/>
                  <img src="pictures/2182.jpg"/>
                  <img src="pictures/2181.jpg"/>
                  <img src="pictures/1574.jpg"/>
                  <img src="pictures/1573.jpg"/>
                  <img src="pictures/1572.jpg"/>
                  <img src="pictures/1269.jpg"/>
                  <img src="pictures/1230.jpg"/>
                  <img src="pictures/221.jpg"/>
                  <img src="pictures/220.jpg"/>
                </div>'

有什么办法吗?

【问题讨论】:

    标签: javascript mysql arrays for-loop


    【解决方案1】:

    一种选择是在渲染之前重新排列您的fullcheckins。比如:

    var groups = fullcheckins.reduce(function (groups, checkin) {
      var groupBy = checkin[2];
      if (!groups.hasOwnProperty(groupBy)) {
        groups[groupBy] = [];
      }
      groups[groupBy].push(checkin)
      return groups
    }, {})
    

    然后你会得到类似的东西

    {
      40.8684: Array[10],
      39.5938: Array[1],
      44.8145: Array[1],
      44.8201: Array[4]
    }
    

    【讨论】:

    • 这实际上可能非常有用。我可以通过两个元素而不是一个元素来分组吗?此外,如问题中所述,fullcheckins 数组已按 checkin[1]、checkin[2]、checkin[3]、降序 checkin[0] 排序
    • 您当然可以,只需将var groupBy 行更改为您想要的任何内容。例如,像 var groupBy = checkin[2] + "," + checkin[3]; 这样的东西会给你看起来像 "40.8684,-74.0223"
    • 我要指出,没有一个可用选项是唯一标识商业位置的完美方式(我假设这是您想要做的)。如果您的查询可以通过任何方式返回数据库用于该位置的任何唯一标识符,那绝对是最好的使用键。
    • 不幸的是,数据库中没有唯一的位置标识符。在这种情况下,纬度/经度总是唯一的,所以你说的就足够了。我的下一个问题是如何将其转换为html格式。
    • 我已经回答了我自己的问题。效果很好,非常感谢!
    【解决方案2】:

    我相信这就是你要找的。​​p>

    1) 首先构建一个跟踪每次出现的 id 的结果对象

    2) 现在我们有了一个索引映射到 ids 的对象

    3) 为每一个编写适当的 html

    var results = {}
    
    var fullcheckins = [
      ["3835", "101 Pub", "40.8684", "-74.0223"],
      ["2182", "101 Pub", "40.8684", "-74.0223"],
      ["2181", "101 Pub", "40.8684", "-74.0223"],
      ["1574", "101 Pub", "40.8684", "-74.0223"],
      ["1573", "101 Pub", "40.8684", "-74.0223"],
      ["1572", "101 Pub", "40.8684", "-74.0223"],
      ["1269", "101 Pub", "40.8684", "-74.0223"],
      ["1230", "101 Pub", "40.8684", "-74.0223"],
      ["221", "101 Pub", "40.8684", "-74.0223"],
      ["220", "101 Pub", "40.8684", "-74.0223"],
      ["697", "113th St. Beach, LBI", "39.5938", "-74.2145"],
      ["2838", "14th Star Brewery and Taproom", "44.8145", "-73.0817"],
      ["2844", "14th Star Brewing Co", "44.8201", "-73.0854"],
      ["2842", "14th Star Brewing Co", "44.8201", "-73.0854"],
      ["2841", "14th Star Brewing Co", "44.8201", "-73.0854"],
      ["2840", "14th Star Brewing Co", "44.8201", "-73.0854"]
    ];
    
    fullcheckins.map(function(checkin) {
      var numINQuestion = checkin[2]
      results[numINQuestion] = []
      for (var i = fullcheckins.length - 1; i >= 0; i--) {
        if (fullcheckins[i][2] == numINQuestion) {
          results[numINQuestion].push(fullcheckins[i][0])
        }
      };
    })
    
    for (var prop in results) {
      var htmlscript = '<div id="slideShowImages-" ' + prop + '>';
      results[prop].forEach(function(id) {
        htmlscript += '<img src="pictures/' + id + '.jpg"/>';
        htmlscript += '</div>';
      })
    
      $('#results').append(htmlscript)
    }
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
    <div id="results"></div>

    【讨论】:

    • 这看起来效果很好。我唯一的问题是:numINQuestion 可以同时基于checkin[2]checkin[3] 吗? checkin[2] 有可能不是唯一的,但两者结合起来就是。
    • 我的意思是,当然...该变量是在传递给 map 的回调函数中声明的。 map 数组方法将该回调函数映射到调用它的数组中的每个元素。在这种情况下,它是一个值数组 /* ["2840", "14th Star Brewing Co", "44.8201", "- 73.0854"]*/ 你可以用developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…做任何你想做的事
    • 要回答您的问题,您应该在 if 语句中检查两个坐标是否相等,并将结果对象上的属性命名为表示该地点索引的更有意义的内容,例如 locationName
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-14
    • 2011-09-28
    • 1970-01-01
    相关资源
    最近更新 更多