Цикл по массиву и группировка элементов по модулю - jquery

У меня множество компаний:

var list = ["company1", "company2", "company3", "company4", "company5", "company6"];

И я хочу пройтись по массиву и добавить список компаний в дом группами по три. Как это:

<div class = "row">
    <div class = "col col-4">Company 1</div>
    <div class = "col col-4">Company 2</div>
    <div class = "col col-4">Company 3</div>
</div>
<div class = "row">
    <div class = "col col-4">Company 4</div>
    <div class = "col col-4">Company 5</div>
    <div class = "col col-4">Company 6</div>
</div>
<div class = "row">
    <div class = "col col-4">Company 7</div>
    <div class = "col col-4">Company 8</div>
    <div class = "col col-4">Company 9</div>
</div>

^ так что это была бы идеальная разметка, которая создается после зацикливания массива. В идеале я хочу создать пустой шаблон разметки - затем прочитать из этого шаблона, а затем создать разметку в js

Мой код:

var list = ["company1", "company2", "company3", "company4", "company5", "company6"];

var itemWrapper = $('.wrapper');
var itemRow = itemWrapper.find('.row');
var itemCol = itemRow.find('.col').eq(0);

console.info("itemRow", itemRow);
console.info("itemCol", itemCol);

itemWrapper.empty();
$.each(list, function(index, value) {
  console.info("index", index);
  console.info("value", value);
  
  if (index % 3 == 0) {
  	console.info("-------new row");
  	$('.wrapper').append('<div class = "row">');
  }
  
  $('.wrapper').append(itemCol.html(value));
  
  if (index % 3 == 0) {
  	//$('.wrapper').append('</div>');
  	console.info("-------end row");
  }
  
});

/*
if (index % 3 == 0) {
  console.info("new row");
  modalWindow.partyContainer.append('<div class = "row party-list">');
}
console.info("modalWindow.itemRow", modalWindow.itemRow);
var itemCol = $(modalWindow.itemRow).html(value.name);
modalWindow.partyContainer.append(itemCol);
if (index + 3 % 3 == 0) {
  console.info("end row");
  modalWindow.partyContainer.append('</div>');
}
if (index == 12) {
  return false;
}
*/
<script src = "https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class = "wrapper">
    <div class = "row">
        <div class = "col col-4">x</div>
        <div class = "col col-4">c</div>
        <div class = "col col-4">v</div>
    </div>
</div>

Вы можете разбить массив на куски из 3 и пропустить его.

sabithpocker 02.05.2018 18:17

Проблема, с которой вы столкнулись, по-видимому, заключается в том, что вы пытаетесь обрабатывать добавление в дом так, как будто вы создаете разметку. Ты не. Когда вы добавляете элементы в дом, вы создаете элементы документа. У элемента нет открывающего или закрывающего тега. Это просто объект. HTML используется как язык описания, чтобы сообщить браузеру, где начинается и где останавливается элемент. Когда вы добавляете напрямую в дом, вы не можете разбить эти операторы. Если вы добавите «<div>», будет создан элемент div. Не ждет / не требует закрытия </div>

Taplar 02.05.2018 18:17

- так добавить голову / хвост как var?

The Old County 02.05.2018 18:21
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
3
84
5

Ответы 5

Просто добавьте новую строку с помощью jQuery, если остаток равен 0, и соответственно добавьте <div>.

var list = ["company1", "company2", "company3", "company4", "company5", "company6"];

var itemWrapper = $('.wrapper');
itemWrapper.empty();

list.forEach(function(row, idx) {
	if (!(idx % 3)) {
  	itemWrapper.append('<div class = "row"></div');
  }
  var itemRow = $('.wrapper .row:last-child');
  itemRow.append('<div class = "col col-4">'+row+'</div>');
});
<script src = "https://code.jquery.com/jquery-3.2.1.js"></script>

<div class = "wrapper">

</div>

Дайте знать, если у вас появятся вопросы. Надеюсь это поможет.

- это хорошо - но это не читается из созданной разметки - потому что вы добавляете классы и разметку в js

The Old County 02.05.2018 18:32

Просто используйте переменную $row, которая будет содержать текущий элемент строки. Обновите эту переменную для каждых трех элементов новым элементом строки. И для каждого элемента просто добавьте в $row:

var list = ["company1", "company2", "company3", "company4", "company5", "company6", "company7"];

var $wrapper = $('.wrapper');
$wrapper.empty();

var $row;                                                      // the current row of elements
$.each(list, function(index, value) {
  if (index % 3 == 0) {                                         // for every three elements
    $row = $('<div class = "row"></div>').appendTo($wrapper);    // create a new row element and assign it to $row
  }
    
  $row.append('<div class = "col col-4">' + value + '</div>');   // add the current element to the current row
});
.row { margin: 10px 0; background: #eee; }

.row > * { display: inline-block; margin: 0 10px; }
<script src = "https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class = "wrapper"></div>

Вы можете использовать array.slice, чтобы разделить массив за вас и перебирать фрагменты, как в моем примере.

Есть ли конкретная причина, по которой вы хотите использовать существующий HTML в качестве шаблона?

var list = ["company1", "company2", "company3", "company4", "company5", "company6", "company7", "company8", "company9", "company10"];

var itemWrapper = $('.wrapper');

var listChunks = [];
var chunkSize = 3;
for (var i = 0; i < list.length; i += chunkSize) {
    listChunks.push(list.slice(i,i+chunkSize));
}

itemWrapper.empty();
var rowHtmlOpen = '<div class = "row">';
var rowHtmlClose = '</div>';
listChunks.forEach(function (chunk) {
    var rowHtml = rowHtmlOpen;
    chunk.forEach(function (col) {
        rowHtml += '<div class = "col col-4">' + col + '</div>'
    });
    rowHtml += rowHtmlClose;
    itemWrapper.append(rowHtml);
});
.row { margin: 10px 0; background: #ffe; }
.row > * { display: inline-block; margin: 0 10px; }
<script src = "https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class = "wrapper"></div>
var list = ["company1", "company2", "company3", "company4", "company5", "company6"];
var wrapper = $('.wrapper');
var row = {};
$.each(list,function(key,val){
    if ((key % 3) == 0){
        row = $('<div>', {'class' : 'row'});
        wrapper.append(row);
    }
    var col = $('<div>', {'class' : 'col col-4'});
    col.text(val);
    row.append(col);
});

Вот версия, в которой используется только javascript. Логика получает столбец и удаляет его из DOM, так что его текст можно изменять, не влияя каждый раз на DOM. Затем он создает строку с HTML-кодом, который должен занять место содержимого оболочки. В самом конце он заменяет содержимое обертки всем результатом. Построение html, а не элементов, устраняет некоторые накладные расходы, а изменение оболочки в самом конце ограничивает количество изменений DOM, оба из которых являются приростом производительности.

Обновлено: внесена небольшая модификация. Я добавил дополнительное название компании, чтобы массив не делился на 3 без остатка, а затем изменил логику закрытия, добавив, независимо от того, является ли элемент последним, поэтому html всегда правильно закрывается.

var list = ["company1", "company2", "company3",
            "company4", "company5", "company6",
            "company7"];

var itemWrapper = document.querySelector('.wrapper');
var itemColumn = itemWrapper.querySelector('.col');
var output = '';

itemColumn.parentNode.removeChild(itemColumn);

list.forEach(function(company, index){
  if (index % 3 === 0) output += '<div class = "row">';
  
  itemColumn.innerText = company;
  output += itemColumn.outerHTML;
  
  if (++index % 3 === 0 || index === list.length) output += '</div>';
});

itemWrapper.innerHTML = output;
<div class = "wrapper">
    <div class = "row">
        <div class = "col col-4">x</div>
        <div class = "col col-4">c</div>
        <div class = "col col-4">v</div>
    </div>
</div>

Другие вопросы по теме