【问题标题】:Mass assignment for elements in a for loopfor循环中元素的质量分配
【发布时间】:2015-04-14 13:12:31
【问题描述】:

我正在处理从 API 中提取信息并希望获取该数据并将其插入到 for-loop 中不同类的某些元素中。现在我正在通过 switch-statement 包裹在 .each() 方法中来执行此操作。似乎这种方式对一个人来说是重复的,并且可能比任何东西都更重性能。有没有一种更简洁有效的方式来实现这一点?

var tracks = [{number: "01", title: "Track 1", duration: "5:35"}, {number: "02", title: "Track 2", duration: "5:15"}, {number: "03", title: "Track 3", duration: "5:07"}, {number: "04", title: "Track 4", duration: "0:16"}, {number: "05", title: "Track 5", duration: "5:35"}];

for (var i = 0, trackNumber, trackTitle, trackDuration; i < tracks.length; i++) {
  trackNumber   = tracks[i]["number"];
  trackTitle    = tracks[i]["title"];
  trackDuration = tracks[i]["duration"];
  
  $("span").each(function() {
    switch($(this).attr("class")) {
      case "number":
        $(".number").eq(i).text(trackNumber);
      case "title":
        $(".title").eq(i).text(trackTitle);
      case "duration":
        $(".duration").eq(i).text(trackDuration);
      default:
        //
    }
  });
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<table>
  <thead>
    <tr>
      <td><b>No</b></td>
      <td><b>Title</b></td>
      <td><b>Duration</b></td>
    </tr>
  </thead>
  <tr>
    <td><span class="number"></span></td>
    <td><span class="title"></span></td>
    <td><span class="duration"></span></td>
  </tr>
  <tr>
    <td><span class="number"></span></td>
    <td><span class="title"></span></td>
    <td><span class="duration"></span></td>
  </tr>
  <tr>
    <td><span class="number"></span></td>
    <td><span class="title"></span></td>
    <td><span class="duration"></span></td>
  </tr>
  <tr>
    <td><span class="number"></span></td>
    <td><span class="title"></span></td>
    <td><span class="duration"></span></td>
  </tr>
  <tr>
    <td><span class="number"></span></td>
    <td><span class="title"></span></td>
    <td><span class="duration"></span></td>
  </tr>
</table>

【问题讨论】:

  • 为什么不动态生成元素呢?

标签: javascript jquery html for-loop switch-statement


【解决方案1】:

你可以编码:

$('tbody td span').text(function() {
    var i = this.parentNode.parentNode.rowIndex - 1;
    return tracks[i][this.className];
});

在上面的sn -p rowIndex 中的tr 元素用于通过索引获取特定数组的元素。使用括号表示法 ([index]) 和 span 元素的 className,相应属性的值由 text 方法设置。 Here is a demo.

由于表格在thead 元素中有一行,因此tbody 元素的第一个tr 子元素的rowIndex1。这就是为什么返回值要减去 1。

请注意,您应该考虑根据返回的数据生成tr 元素。可以选择使用模板库。

编辑:您也可以使用原生 JavaScript:

var spans = document.querySelectorAll('tbody td span');
Array.prototype.forEach.call(spans, function (el) {
    var i = el.parentNode.parentNode.rowIndex - 1;
    el.textContent = tracks[i][el.className];
});

【讨论】:

  • 我仍然感到困惑的一件事是从rowIndex 中减去 1。这是为什么呢?
  • 谢谢,这看起来很棒。如果您不介意,还有两个问题。假设我要在跨度没有父项的不同项目中使用这个 sn-p 将需要 parentNoderowInded 吗?第二个问题,性能方面,与for-loop 相比,.text() 方法是否足够?
  • @CarlEdwards 欢迎您。只有tr 元素具有rowIndex 属性,td 元素具有cellIndex,其工作方式类似于rowIndex。许多 DOM 元素没有相应的属性。您可以在需要索引时使用 jQuery .index() 方法。上面的 sn-p 使用rowIndex 使代码更高效。上面的代码应该比你当前的代码运行得快得多。您可以在jsperf.com 上测试 sn-ps
  • 再次非常感谢。 +1 以简洁明了的方式帮助将 18 行减少到 4 行。
  • 非常有意义。谢谢!
【解决方案2】:

你可以使用:

 $("span.number").eq(i).text(trackNumber);
 $("span.title").eq(i).text(trackTitle);
 $("span.duration").eq(i).text(trackDuration);

【讨论】:

  • 巴姆。为什么要复杂:)
  • 注意:在循环之前缓存$("span.number")和另外两个会更好。
  • 通过这种方式你的代码仍然被认为是 DRY 吗?我正在考虑哈希可能有 5-10 个需要插入的属性。
  • 是的。也可以使用摄政王的建议。
  • 很高兴知道谢谢。回到我想知道的原始代码。在任何情况下,在 for-loop 中使用和 .each() 方法是多余的吗?
【解决方案3】:

怎么样:

var attr = $(this).attr("class");
$("." + attr).eq(i).text(tracks[i][attr]);

【讨论】:

  • $(this) 指的是什么?
  • 我假设在 .each() 方法的主体中?
  • 没错。我假设您想在没有开关的情况下分配值
猜你喜欢
  • 2016-09-07
  • 1970-01-01
  • 2015-07-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多