Создайте и заполните его на основе переданного массива

#javascript

#javascript #массивы

Вопрос:

Мне удалось сгенерировать серию элементов списка на основе одного указанного массива внутри матрицы (т. Е. Массива внутри массива).

Я хотел бы иметь возможность передавать переменную (представляющую массив) в функцию, чтобы она могла выдавать неупорядоченный список, заполненный элементами списка на основе переданного в него массива.

Проблемы:

  • Функция работает только с одним массивом одновременно
  • Он также создает запятые в разметке (предположительно, потому что преобразует массив в строку)

Решение должно:

  • предположим, что неупорядоченный список не существует в 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

Ответ №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]));
  

Вот демонстрация. Возможно, вы также захотите отметить, что set0 и set1 просачиваются в глобальную область; если вы хотели создать своего рода ассоциативный массив, вам следует использовать объект:

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

И получите к ним доступ следующим образом:

 makeUL(options.set0);
  

Комментарии:

1. Да, я позаботился о том, чтобы игнорировать область видимости, просто чтобы быть кратким. Когда я вставлю это в свой проект, оно будет вложено внутрь функции.

2. Кроме того, приятный штрих с ассоциативным массивом.

3. Отличное решение, 1 за отказ от использования jQuery.

4. Почему за это проголосовало больше, чем за одну строку . «<li>» options.set0.join(«</li><li>») «</li>»?

5. @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;
  

Комментарии:

1. Есть вероятность, что ваши параметры получены из ненадежного источника, такого как API. В этом случае вы открыты для XSS

2. Спасибо, что указали на это, а что, если данные из надежного источника?

Ответ №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;