【问题标题】:slice an array based on indeces根据索引对数组进行切片
【发布时间】:2020-12-09 19:04:17
【问题描述】:

我有当前的 HTML:

<div id="1-1">TITLE1</div>
<div id="1-2">TITLE2</div>
<div id="1-3">TITLE3</div>
<div id="1-4">TITLE4</div>
<div id="1-5">TITLE5</div>

<div class="topic">A1</div>
<div class="topic">B2</div>
<div class="topic">C3</div>
<div class="topic">D4</div>
<div class="topic">E5</div>
<div class="topic">F6</div>
<div class="topic">G7</div>
<div class="topic">H8</div>
<div class="topic">I9</div>
<div class="topic">J10</div>
<div class="topic">K11</div>
<div class="topic">L12</div>
<div class="topic">M13</div>
<div class="topic">N14</div>
<div class="topic">O15</div>

我想使用 JavaScript 创建一个 for loop,它将基于此对象将正确的 .topic 节点附加到正确的 TITLE div 中:

all = {'1-1': ['A', 'B', 'C'], 
       '1-2': ['D'],
       '1-3': ['E', 'F', 'G', 'H'],
       '1-4': ['I', 'J'],
       '1-5': ['K', 'L', 'M', 'N', 'O']
      };

循环理想的结果:

<div id="1-1">TITLE1
<div class="topic">A1</div>
<div class="topic">B2</div>
<div class="topic">C3</div>
</div>

<div id="1-2">TITLE2
<div class="topic">D4</div>
</div>

<div id="1-3">TITLE3
<div class="topic">E5</div>
<div class="topic">F6</div>
<div class="topic">G7</div>
<div class="topic">H8</div>
</div>

<div id="1-4">TITLE4
<div class="topic">I9</div>
<div class="topic">J10</div>
</div>

<div id="1-5">TITLE5
<div class="topic">K11</div>
<div class="topic">L12</div>
<div class="topic">M13</div>
<div class="topic">N14</div>
<div class="topic">O15</div>
</div>

我通过创建两个数组尝试了这一点——all 中的“TITLE*”位置之一和每个切片中应该有多少“主题”的另一个位置

let header_position = [0,4,6,11,14]
let topics_between = [3,1,4,2,5]

我试图利用这一点并为for loop 找到一个模式,以便我可以使用这些数组编号将事物放在正确的位置,但我似乎无法找出正确的循环。任何帮助将不胜感激:

尝试的解决方案

for (i = 0; i < header_position.length; i++) {
  // i = 0 topics.slice(0,2)
  // i = 2 topics.slice(3,3)
  // i = 3 topics.slice(4,7)
  // i = 4 topics.slice(8,9)
  // i = 5 topics.slice(10,14)
  
  let currentslice = topics.slice(header_position[i] + 1, header_position[i + 1] - 2)
  
  if (i === 0) {
    currentslice = topics.slice(0, topics_between[i] - 1)
  }
  
  console.log(currentslice)
  currentslice.appendTo("#1-" + [i + 1])
}

这个循环不能按现在的样子工作,但我希望能在尝试使这个逻辑正常运行时提供任何帮助或考虑!

【问题讨论】:

  • 你能改变all数组的结构吗?我会选择一个对象,将标题 ids 作为键,并将内容标识符数组作为值。喜欢all = {'1-1': ['A', 'B', 'C'], ...};。这将相对容易迭代。
  • 嗨@Teemu!我已根据您的建议更改了对象 - 谢谢!
  • 甚至没有标题ID:jsfiddle.net/ov51ghp2/1。但是,如果您必须手动维护订单表,那么使用对象可能会更舒服一些。一个理想的解决方案是,主题将有一个标识标题的类,将主题附加到标题下将是一个 O(n) 循环。

标签: javascript html jquery loops


【解决方案1】:

你的问题似乎很理论......对我来说看起来像XY problem

我假设你的标题肯定不会是 TITLE1TITLE2 等等,并带有一些真实的内容。

我想您设法定义了 all 数组以开始组织您的页面...但是从发布的内容来看,我无法提出更好的方法。

因此,如果我按原样采用 allheader_position 数组,则循环将使用两个 索引,一个用于标题,一个用于主题。

看看下面,告诉我这是否回答了您的理论问题以及您的具体需求。

let all = [ "TITLE1", "A", "B", "C", 
            "TITLE2", "D",
            "TITLE3", "E", "F", "G", "H",
            "TITLE4", "I", "J",
            "TITLE5", "K", "L", "M", "N", "O"]
            
let header_position = [0,4,6,11,14]
//let topics_between = [3,1,4,2,5]  // not used

let headerIndex = -1
let topicIndex = 0

for(i=0;i<all.length;i++){
  if(header_position.indexOf(i)>-1){
    headerIndex++
    continue
  }
  $(".header").eq(headerIndex).append($(".topic").eq(topicIndex))
  topicIndex++
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="header" id="1-1">TITLE1</div>
<div class="header" id="1-2">TITLE2</div>
<div class="header" id="1-3">TITLE3</div>
<div class="header" id="1-4">TITLE4</div>
<div class="header" id="1-5">TITLE5</div>

<div class="topic">A1</div>
<div class="topic">B2</div>
<div class="topic">C3</div>
<div class="topic">D4</div>
<div class="topic">E5</div>
<div class="topic">F6</div>
<div class="topic">G7</div>
<div class="topic">H8</div>
<div class="topic">I9</div>
<div class="topic">J10</div>
<div class="topic">K11</div>
<div class="topic">L12</div>
<div class="topic">M13</div>
<div class="topic">N14</div>
<div class="topic">O15</div>

【讨论】:

    【解决方案2】:

    据我了解,您希望将其按标题分开。你可以这样做:

    let count = 0;
    
    for (let i = 0; i < all.length; i++) {
        if (all[i].includes("TITLE")) {
            let element = document.createElement("div");
            element.innerHTML = all[i];
            element.id = `1-${count + 1}`;
            document.body.appendChild(element);
            count++;
        } else {
            let element = document.createElement("div");
            element.className = "topic";
            element.innerHTML = `${all[i]}${i - count + 1}`;
            document.getElementById(`1-${count}`).appendChild(element);
        }
    }
    

    让我知道它是否有效。

    【讨论】:

      猜你喜欢
      • 2015-04-15
      • 2020-02-27
      • 2018-09-26
      • 2014-05-02
      • 2019-11-14
      • 2020-12-26
      • 1970-01-01
      • 2018-11-07
      • 2017-05-21
      相关资源
      最近更新 更多