虽然循环是重复而不是递增结果

时间:2017-10-25 15:27:51

标签: javascript json

我成功地显示了我在两个对象值之间进行比较的所有结果,但是当我添加...

while (l++ < 12) {
    Do Something
}

到l for循环中的代码。

基本上我将导航子类别中的值与文章中的子类别进行比较,并通过...显示结果。

if ( thisArticleContainerSlug === thisArticleSlug.subcategoryslug ) {
    ...
}

问题是while循环重复了我的结果而不是递增它们。

for (var i = 0 ; i < data.nav1.length; i++) {
navigationLevel = data.nav1[i];
    var navigationSubLevel = navigationLevel.subcategories;
    <section>
        if ( navigationLevel.hasOwnProperty("subcategories") ) {
            <ul>
                for (j = 0; j < navigationSubLevel.length; j++) {
                    <li>Do something..</li>
                }
            </ul>
            for (k = 0; k < navigationSubLevel.length; k++) {
                var thisArticleContainerSlug = navigationSubLevel[k].subcategoryslug;
                <div>
                    for (l = 0; l < data.articles.length; l++) {
                        var thisArticleSlug = data.articles[l];
                        while (l++ < 12) { <----- This is where I am adding the while loop
                            if ( thisArticleContainerSlug === thisArticleSlug.subcategoryslug ) {
                                <article>
                                    Do Something
                                </article>
                            }
                        } <------ This where it closes
                    }
                </div>
            }
        }
    </section>
}

非常感谢任何帮助。

提前谢谢大家!

2 个答案:

答案 0 :(得分:0)

如果我只采用代码中最重要的部分:(我重新添加EJS标记,因为它们很有用,但请注意,您可以使用EJS制作多行Javascript代码)

<% for (l = 0; l < data.articles.length; l++) {
    var thisArticleSlug = data.articles[l];
    while (l++ < 12) { <----- This is where I am adding the while loop
         if ( thisArticleContainerSlug === thisArticleSlug.subcategoryslug ) {%>
              <article>
                    <%Do Something%>
              </article>
         <%}
    } <------ This where it closes
}%>

正如我现在所理解的(在评论的帮助下),您希望过滤文章以仅保留thisArticleContainerSlug === thisArticleSlug.subcategoryslug并且您希望将结果数限制为12的文章。

你不能用for循环来做这件事。就像你现在这样做,你限制了检查的文章数量&#34; data.articles&#34;到了第12个。

想要你想要的,你需要先创建一个你想要的所有文章的列表,然后将大小限制为12个。

你可以用另一个变量这样做:

<% for (let l = 0, goodArticle = 0; l < data.articles.length && goodArticle < 12; l++) {
     var thisArticleSlug = data.articles[l];
     if ( thisArticleContainerSlug === thisArticleSlug.subcategoryslug ) {
          goodArticle++;%>
          <article>
                <%Do Something%>
          </article>
     <%}
}%>

但我发现使用ES5 / ES6样式会更好(EJS中的所有代码都与节点一起使用,因此不存在旧的浏览器不兼容性)

<% data.articles
    .filter(thisArticleSlug => thisArticleContainerSlug === thisArticleSlug.subcategoryslug )
    .slice(0, 12).forEach(thisArticleSlug  => {%>
          <article>
                <%Do Something%>
          </article>
<%})%>

请注意,这可能不是您想要做的,因为在问题中没有明确说明什么是最终目标。

答案 1 :(得分:0)

我自己已经解决了这个问题,但为了简洁和其他任何有这个问题的人我已经在下面添加了解决方案......

感谢@James提供种子!

出了什么问题...... 正如@James指出的那样,我每次都使用while循环迭代相同的data.articles结构。

解决方案是在for循环之外创建一个等于0的变量,在if语句中创建一个带有迭代限制的第二个if语句,并在if语句中增加变量。

<% var ifStatementIterationLimit = 0; %>
for (l = 0; l < data.articles.length; l++) {
    var thisArticleSlug = data.articles[l];
    if ( thisArticleContainerSlug === thisArticleSlug.subcategoryslug ) {
        <% if (ifStatementIterationLimit < 12) { %>
            <article>
                Do Something
            </article>
            <% ifStatementIterationLimit ++; %>
        }
    }
}

感谢@Felix Brunet尝试解决方案。

我希望将来帮助其他人=]