Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 17.11.2016, 17:22
Аватар для Bravo
Интересующийся
Отправить личное сообщение для Bravo Посмотреть профиль Найти все сообщения от Bravo
 
Регистрация: 26.03.2014
Сообщений: 19

Как лучше формировать DOM по данным массива?
Приветствую , возник такой вопрос. Есть след. данные:
"car": [
    {
      "id": 1,
      "name": "BMW",
      "year": 1999,
      "parts": [1,2]
    }],
  "parts": [
    {
      "id": 1,
      "name": "engine"
    },
    {
      "id": 2,
      "name": "window"
    }
]

Это короткий вариант, полный содержит ~100 деталей.

Моя задача сформировать из этого страницу, где будут отображаться список из ~100 деталей (parts) и показано для какой это машины (car.name).

<div id="parts">
<div>Part 1 (engine) – BMW</div>
<div>Part 2 (window) – BMW</div>
</div>


Страница формируется в реальном времени, после получения данных, следовательно в начале элемент #parts пустой.

Как лучше перебирать и сопоставлять данные массива и формировать DOM, чтобы это было не слишком медленно? Интересует красивый и понятный вариант на чистом JS и возможные варианты на Jquery.
Ответить с цитированием
  #2 (permalink)  
Старый 17.11.2016, 17:40
Аватар для Coriolan161
Профессор
Отправить личное сообщение для Coriolan161 Посмотреть профиль Найти все сообщения от Coriolan161
 
Регистрация: 21.11.2015
Сообщений: 440

Bravo,
надо пихать в DocumentFragment заджойненный массив твоих партов, а потом добавлять твой DocumentFragment в parts
Ответить с цитированием
  #3 (permalink)  
Старый 17.11.2016, 17:41
Аватар для Coriolan161
Профессор
Отправить личное сообщение для Coriolan161 Посмотреть профиль Найти все сообщения от Coriolan161
 
Регистрация: 21.11.2015
Сообщений: 440

Bravo,
никакой херни с createElement в цикле
Ответить с цитированием
  #4 (permalink)  
Старый 17.11.2016, 17:49
Профессор
Отправить личное сообщение для Rise Посмотреть профиль Найти все сообщения от Rise
 
Регистрация: 07.11.2013
Сообщений: 4,662

Coriolan161, у DocumentFragment нет innerHTML и insertAdjacentHTML
Ответить с цитированием
  #5 (permalink)  
Старый 17.11.2016, 18:09
Аватар для Coriolan161
Профессор
Отправить личное сообщение для Coriolan161 Посмотреть профиль Найти все сообщения от Coriolan161
 
Регистрация: 21.11.2015
Сообщений: 440

Bravo,
Отставить. Идеи смешались.
1) Либо пихать заджойненный массив в #parts.innerHTML
2) Либо создавать DocumentFragment, обходить все парты в цикле, делать createElement('div'), в див пихать детали и фрагмент.appendChild(див), и в конце запихать фрагмент в #parts
Ответить с цитированием
  #6 (permalink)  
Старый 17.11.2016, 18:18
Профессор
Отправить личное сообщение для Dilettante_Pro Посмотреть профиль Найти все сообщения от Dilettante_Pro
 
Регистрация: 27.11.2015
Сообщений: 2,899

только данные немного поправил
<!DOCTYPE html>
<html>
<head>
    <title>Cars Details</title>
    <script>
        var cars = [
    { "car":
     {
        "id": 1,
        "name": "BMW",
        "year": 1999
    },
        "parts": [
    {
        "id": 11,
        "name": "engine"
    },
    {
        "id": 12,
        "name": "window"
    }]
    },
    { "car":
    {
        "id": 2,
        "name": "Audi",
        "year": 2000
    },
        "parts": [
    {
        "id": 21,
        "name": "engine"
    },
    {
        "id": 22,
        "name": "window"
    }]
    }
];
    window.onload = function () {
        var fragment = document.createDocumentFragment();
        cars.forEach(function (item, i, arr) {
            item.parts.forEach(function (part, j, ar) {
                var d = document.createElement('div');
                d.setAttribute('id', part.id);
                fragment.appendChild(d);
                d.innerHTML = 'Part ' + part.id + ' (' +part.name + ') ' + item.car.name ;
            });
        });
        parts.appendChild(fragment);
    }

    </script>
</head>
<body>
   <div id="parts"></div>
</body>
</html>

Цитата:
В современных браузерах эффект от такой оптимизации может быть различным, а на небольших документах иногда и отрицательным.
https://learn.javascript.ru/multi-insert

Последний раз редактировалось Dilettante_Pro, 17.11.2016 в 18:22.
Ответить с цитированием
  #7 (permalink)  
Старый 17.11.2016, 18:42
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,070


<!DOCTYPE html>

<html>
<head>
  <title>Untitled</title>
  <meta charset="utf-8">


</head>

<body>
<div id="parts"></div>
 <script>
var data = {
"car": [
    {
      "id": 1,
      "name": "BMW",
      "year": 1999,
      "parts": [1,2]
    }],
  "parts": [
    {
      "id": 1,
      "name": "engine"
    },
    {
      "id": 2,
      "name": "window"
    }
] };

var parts = data.parts.reduce(function(a, b) {
        a[b.id] = b.name;
        return a
    }, {}),
    arr = data.car.reduce(function(a, b) {
        return a.concat(b.parts.map(function(a) {
            return "Part " + a + " (" + parts[a] + ") - " + b.name
        }))
    }, []);
 document.querySelector('#parts').insertAdjacentHTML("beforeEnd", "<div>" + arr.join("</div><div>") +"</div>");

  </script>
</body>
</html>

Последний раз редактировалось рони, 17.11.2016 в 18:44.
Ответить с цитированием
  #8 (permalink)  
Старый 17.11.2016, 18:47
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,070

Dilettante_Pro,
исравил beforeEnd
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как лучше решить задачу с утечкой памяти? JSInteres Общие вопросы Javascript 6 27.02.2015 18:19
Как улучшить сортировку массива? Armen Общие вопросы Javascript 3 12.10.2014 20:17
Прошу высказать замечания как сделать лучше Vlasenko Fedor Элементы интерфейса 10 24.07.2014 13:47
Подскажите как сравнить первые элементы многомерного массива? yloboda Элементы интерфейса 3 08.06.2014 15:00
Как достать данные из JSON массива? Dimaz jQuery 15 27.11.2012 21:58