如何停止循环以仅获取第一个数组的内容?

Posted

技术标签:

【中文标题】如何停止循环以仅获取第一个数组的内容?【英文标题】:How to stop looping to get only the contents of first array? 【发布时间】:2017-08-07 18:59:08 【问题描述】:

这是我的代码模型。

我在这个变量中接收到一个数据:

this.data = data.details;

然后我正在过滤要删除的重复项并将其放入另一个数组中,如下所示:

let dataUnique = this.data.filter(function(el, index, self) 
     return index == self.indexOf(el);

dataUniqueconsole.log

Array[14]
0: "a"
1: "b"
2: "c"
3: "d"
4: "e"
5: "g"
6: "h"
7: "i"
8: "j"
9: "k"
10: "l"
11: "m"
12: "n"
13: "o"

现在问题发生在这个 if 语句中:

if(something == true) 
        let uData = JSON.parse(localStorage.getItem('user'));
        switch (uData.language) 
             case 'de':
             document.querySelector('table tr').insertAdjacenthtml('afterbegin', '<td'> + dataUnique + '</td>');
             break;
        
    

问题是我在switch 之前的if 语句中得到dataUnique array 字段的dataUnique array 数量等于something 的数量是true

所以不是得到:

<table>
    <tr>
        <td>a b c d e f g h i j k l m n o</td>
    </td>
</table>

我收到了:

<table>
    <tr>
        <td>a b c d e f g h i j k l m n o</td>
        <td>a b c d e f g h i j k l m n o</td>
        <td>a b c d e f g h i j k l m n o</td>
        <td>a b c d e f g h i j k l m n o</td>
        <td>a b c d e f g h i j k l m n o</td>
    </td>
</table>

&lt;td&gt;a b c d e f g h i j k l m n o&lt;/td&gt; 的数量等于我的if 语句中的something == true 的数量。我知道问题是什么,但我不知道如何解决。

谢谢。

编辑:我在上面有 for in 循环,即:

for (let sth in somethingObj) 
     let something = somethingObj[sth];
     if(something.something == true) ...

【问题讨论】:

你确定你没有一个循环,里面有你的 if 吗?请张贴minimal 代码.. 请注意,我可以用 CSS 解决它:table td:not(:first-child)display:none;,但这并不是真正的解决方案。 我上面有,等一下。 你去,编辑。 【参考方案1】:

javascript 允许您命名循环(如 EMCA-262 第 12.12 节中所定义。[MDN Docs])。

这让我们可以为break 命令指定循环名称,以便 js 跳出那个循环:

loop1:
for(var i = 0; i < 10; i++) 
loop2:
  for(var j=0;j<10;j++) 

    console.log(i, j);
    break loop1;

  

这里我们告诉 break 命令突破loop1。结果,在console.log 中是0 0。如果我们只是休息一下,我们最终会得到这样的结果:

0 0
1 0
2 0
3 0
4 0
5 0
6 0
7 0
8 0
9 0

将此逻辑输入到您的代码中:

outerLoop:
for (let sth in somethingObj) 
     let something = somethingObj[sth];
     if(something == true) 
        let uData = JSON.parse(localStorage.getItem('user'));
        switch (uData.language) 
             case 'de':
             document.querySelector('table tr').insertAdjacentHTML('afterbegin', '<td'> + dataUnique + '</td>');
             break outerLoop;
        
    

【讨论】:

【参考方案2】:

当然,将检查放入循环中会给您提供与 trues 一样多的 tds ,您拥有的 breakswitch 内,因此仅对 switch 有效而不是for 循环...我会说评估something.something 并将其分配给一个变量,然后执行下一步:

var test = false;
for (let sth in somethingObj) 
     let something = somethingObj[sth];
     if(something.something == true) test=true;break ;

if(test)//do your if business here.
let uData = JSON.parse(localStorage.getItem('user'));
    switch (uData.language) 
         case 'de':
         document.querySelector('table tr').insertAdjacentHTML('afterbegin', '<td'> + dataUnique + '</td>');
         break;
    

另一种方式(对您的逻辑进行最少的修改):

for (let sth in somethingObj) 
     let something = somethingObj[sth];
     if(something.something == true) 
        let uData = JSON.parse(localStorage.getItem('user'));
    switch (uData.language) 
         case 'de':
         document.querySelector('table tr').insertAdjacentHTML('afterbegin', '<td'> + dataUnique + '</td>');
         break; // this breaks out of the switch ..
     break; // this breaks out of the for loop
     

【讨论】:

请稍等。 你能不能把它应用到我的完整代码上,我在这里遗漏了一些东西.. 不,您的开关有中断...您需要将其从开关中取出...请检查我的编辑。 第二种方法帮助缩小到只有 5 个 tds...(我有 20 个)。我在上面还有一个 for in 循环,这可能是问题吗? @eric.dummy 是的

以上是关于如何停止循环以仅获取第一个数组的内容?的主要内容,如果未能解决你的问题,请参考以下文章

如何优化此代码以仅显示圆形数组的轮廓?

如何迭代数组的数组

vue如何获取数组的中的第一个对象

Objective C如何在从第一个VC移动到第二个时停止无限循环

VBA:从数组中创建选定的字符串

如何在一个循环执行ajax方法里面嵌套的ajax方法