【问题标题】:Create a <ul> and fill it based on a passed array创建一个 <ul> 并根据传递的数组填充它
【发布时间】:2012-06-23 03:06:18
【问题描述】:

我已经设法根据矩阵中的一个指定数组(即数组中的数组)生成一系列列表项。

我希望能够将一个变量(表示一个数组)传递给一个函数,以便它可以根据传入的数组吐出一个充满列表项的无序列表。

问题:

  • 该函数一次只能处理一个数组
  • 它还在标记中生成逗号(大概是因为它将数组转换为字符串)

解决方案需要:

  • 假设 DOM 中不存在无序列表
  • 能够接受传入其中的不同数组(options[0]、options[1] 等)
  • 生成不带逗号的列表项

JavaScript:

var options = [
        set0 = ['Option 1','Option 2'],
        set1 = ['First Option','Second Option','Third Option']
    ]

function makeUL(){
    var a = '<ul>',
        b = '</ul>',
        m = [];

    // Right now, this loop only works with one
    // explicitly specified array (options[0] aka 'set0')
    for (i = 0; i < options[0].length; i += 1){
        m[i] = '<li>' + options[0][i] + '</li>';
    }

    document.getElementById('foo').innerHTML = a + m + b;
}

// My goal is to be able to pass a variable
// here to utilize this function with different arrays
makeUL();

jsFiddle

【问题讨论】:

    标签: javascript arrays


    【解决方案1】:

    首先,不要通过字符串连接来创建 HTML 元素。使用 DOM 操作。它更快、更干净、更不容易出错。仅此一项就解决了您的一个问题。然后,让它接受任何数组作为参数:

    var options = [
            set0 = ['Option 1','Option 2'],
            set1 = ['First Option','Second Option','Third Option']
        ];
    
    function makeUL(array) {
        // Create the list element:
        var list = document.createElement('ul');
    
        for (var i = 0; i < array.length; i++) {
            // Create the list item:
            var item = document.createElement('li');
    
            // Set its contents:
            item.appendChild(document.createTextNode(array[i]));
    
            // Add it to the list:
            list.appendChild(item);
        }
    
        // Finally, return the constructed list:
        return list;
    }
    
    // Add the contents of options[0] to #foo:
    document.getElementById('foo').appendChild(makeUL(options[0]));
    

    Here's a demo. 您可能还需要注意set0 和set1 正在泄漏到全局范围;如果你打算创建一种关联数组,你应该使用一个对象:

    var options = {
        set0: ['Option 1', 'Option 2'],
        set1: ['First Option', 'Second Option', 'Third Option']
    };
    

    然后像这样访问它们:

    makeUL(options.set0);
    

    【讨论】:

    • 是的,为了简短起见,我确保忽略范围。当我将它粘贴到我的项目中时,它会嵌套在一个函数中。
    • 另外,与关联数组很好的接触。
    • 不错的解决方案,+1 不使用 jQuery。
    • 为什么这个投票比一个班轮多。 "
    • " + options.set0.join("
    • ") + "
    • " ?
  • @SahibKhan:这会将options.set0 的元素解释为 HTML,这通常是不可取的。 (XSS漏洞的常见来源。当列表为空时也会产生一个空元素。)
  • 【解决方案2】:

    以下解决方案的缺点是什么?似乎更快更短。

    var options = {
        set0: ['Option 1','Option 2'],
        set1: ['First Option','Second Option','Third Option']
    };
    
    var list = "<li>" + options.set0.join("</li><li>") + "</li>";
    document.getElementById("list").innerHTML = list;
    

    【讨论】:

    • 您的选项有可能来自 API 等不受信任的来源。在这种情况下,您对 XSS 持开放态度
    • 感谢您指出这一点,如果数据来自可信来源怎么办?
    【解决方案3】:

    您也可以考虑以下解决方案:

    let sum = options.set0.concat(options.set1);
    const codeHTML = '<ol>' + sum.reduce((html, item) => {
        return html + "<li>" + item + "</li>";
            }, "") + '</ol>';
    document.querySelector("#list").innerHTML = codeHTML;
    

    【讨论】:

      猜你喜欢
      相关资源
      最近更新 更多
      热门标签