【问题标题】: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;},但这并不是真正的解决方案。
  • 我上面有,等一下。
  • 你去,编辑。

标签: javascript jquery html arrays for-loop


【解决方案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 是的
    猜你喜欢
    • 2021-09-15
    • 2016-03-18
    • 2012-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-01
    • 1970-01-01
    • 2019-09-10
    相关资源
    最近更新 更多