【问题标题】:JavaScript: How to generate nested ordered listJavaScript:如何生成嵌套有序列表
【发布时间】:2017-01-27 12:52:00
【问题描述】:

如何从以下内容生成嵌套的有序列表?我已经搜索了论坛并工作了几个小时,以根据源内容中的不同类生成有序列表。内容最多可以有 6 个嵌套 等级。 我需要的是根据不同的类生成有序列表。如示例内容所示,以获得类似于下面概述的示例内容。

.firstclass => 1. 
    .secondclass => 1.
        .thirdclass => 1.
            .fourthclass => 1.

代码:

var cheerio = require('cheerio');
var $ = cheerio.load('<h1 class="header">First Header</h1><p class="firstclass">First Lorem ipsum dolor sit.</p><p class="firstclass">First Qui consequatur labore at.</p><p class="secondclass">Second Lorem ipsum dolor sit amet.</p>    <p class="thirdclass">Third Lorem ipsum dolor sit amet.</p><p class="thirdclass">Third Molestias optio quasi ipsam unde!</p><p class="secondclass">Second Lorem ipsum dolor sit amet, consectetur.</p><p class="fourthclass">Fourth Lorem ipsum dolor sit.</p><p class="firstclass">First Lorem ipsum dolor sit amet.</p>', {
    normalizeWhitespace: true,
    xmlMode: true,
    decodeEntities: false,
});

var myContent = $('p').each(function() {
    var para = $(this).text();
    return para;
});

var olClass = ['.firstclass', '.secondclass', '.thirdclass', '.fourthclass'];

function arrToOl(arr) {
    var ol = $('<ol />'),
        li = $('<li />');
    for (var i = 0; i < arr.length; i++) {
        if (Array.isArray(arr[i])) {
            li.append(arrToOl(arr[i]));
        } else {
            li = $('<li />');
            li.append($(arr[i]));
            ol.append(li);
        }
    }
    return $.html(ol);
}
console.dir(arrToOl(olClass));

上面的代码产生以下内容:

'<ol><li><p class="firstclass">First Lorem ipsum dolor sit.</p><p class="firstclass">First Qui consequatur labore at.</p><p class="firstclass">First Lorem ipsum dolor sit amet.</p></li><li><p class="secondclass">Second Lorem ipsum dolor sit amet.</p><p class="secondclass">Second Lorem ipsum dolor sit amet, consectetur.</p></li><li><p class="thirdclass">Third Lorem ipsum dolor sit amet.</p><p class="thirdclass">Third Molestias optio quasi ipsam unde!</p></li><li><p class="fourthclass">Fourth Lorem ipsum dolor sit.</p></li></ol>'

期望的结果应该是:

   <ol>
    <li>
        <p class="firstclass">First Lorem ipsum dolor sit.</p>
    </li>
    <li>
        <p class="firstclass">First Qui consequatur labore at.</p>
    </li>
    <li>
        <p class="firstclass">First Lorem ipsum dolor sit amet.</p>
        <ol>
            <li>
                <p class="secondclass">Second Lorem ipsum dolor sit amet.</p>
            </li>
            <li>
                <p class="secondclass">Second Lorem ipsum dolor sit amet, consectetur.</p>
                <ol>
                    <li>
                        <p class="thirdclass">Third Lorem ipsum dolor sit amet.</p>
                    </li>
                    <li>
                        <p class="thirdclass">Third Molestias optio quasi ipsam unde!</p>
                        <ol>
                            <li>
                                <p class="fourthclass">Fourth Lorem ipsum dolor sit.</p>
                            </li>
                        </ol>
                    </li>
                </ol>
            </li>
        </ol>
    </li>
</ol>

非常感谢您的帮助。

【问题讨论】:

  • 为了帮助我们和您自己编写可读代码,您可以使用`(反引号)代替引号来获得多行代码

标签: javascript html node.js cheerio


【解决方案1】:

这就是我得到的。

let array = ["a", "b", "c", "d"];
var nested;

function create_nested()
{
  var old_ol;
  for (let i = 0; i < array.length; i++)
  {
  	let new_ol = document.createElement("ol");
  	let new_li = document.createElement("li");
    new_li.innerHTML = array[i];
	new_ol.appendChild(new_li);
    
    if (i !== 0)
    {
      let nest_li = document.createElement("li");
      let new_p = document.createElement("p");
      new_p.innerHTML = "new stuff";
      nest_li.appendChild(new_p);
      nest_li.appendChild(old_ol);
      new_ol.appendChild(nest_li);
    }
    
    old_ol = new_ol;
    nested = new_ol;
  } 
}

create_nested();

document.getElementById('main').appendChild( nested);
<div id='main'>

</div>

这只是一个示例,并不完全是您拥有的数据(您可以弄清楚)。

我正在使用document.createElement 创建新元素,然后使用appendChild 将它们插入到相应的 ol/li 中。

最重要的部分是if (i !== 0)(更改它以适应您想从数组的开头还是结尾开始)。这是我正在创建巢穴的部分。

我正在创建一个新的li,它有&lt;p&gt;old_ol,这是嵌套的li。所以这个函数在做什么,就是创建最里面的ol,然后向上扩展。

可能有一种更清晰/更好的方法来做到这一点,但据我所知,这是在 vanilla JS 中的。我希望一切都足够清楚。

【讨论】:

  • 你说的“最重要的部分是if (i !== 0)”是什么意思(改变这个以适应你是想从数组的开头还是结尾开始)。这就是我所在的部分创建巢穴。”?我现在正在使用您建议的方法。我正在将其转换为cheerio.js,因此无法正常工作。
  • if (i !== 0) 表示您从数组的开头开始,并且第一个元素是您最里面的ol。如果您从数组 10 的末尾开始,请使用 if (i !== array.length-1)。如果这一切都太复杂了,那就用我写的,看看你的内容是否正确。如果没有,那么反转你的数组。至于cheerio.js,我不知道它是如何工作的。
猜你喜欢
  • 2011-09-29
  • 2020-06-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-01
  • 1970-01-01
相关资源
最近更新 更多