Javascript Сортировка массива/Вывод списка

372
07 июля 2017, 08:26
$.each(data.data, function(idx, data){
     $("#res2").append('<tr><td>' + data.CityRef + '</td><td>' + data.CityDescription + '</td></tr>');
});

в массиве у меня список городов и областей вот пример вывода:

Киев   | Киевская обл.
Ирперь | Киевская обл.
Москва | Московская обл.

Получается с каждым выводом пишется область и она часто повторяется. Вопрос как сделать что ли группировку городов по их областям? (чтобы одна область выводилась один раз) вот так:

-Киевская обл.
--Киев
--Ирпень
-Московская обл.
--Москва
...
Answer 1

const data= [ 
	{city: 'Киев', obl: 'Киевская обл.'}, 
	{city: 'Ирперь', obl: 'Киевская обл.'}, 
	{city: 'Москва', obl: 'Московская обл.'} 
]; 
 
// Переберем массив в объект, где города разложены по областям. 
const sorted = data.reduce((result, el) => { 
    if(result[el.obl]) result[el.obl].push(el.city); 
    else result[el.obl] = [el.city]; 
    return result; 
},{}); 
 
// Выведем. 
for(let obl in sorted){ 
    document.getElementById("res2").innerHTML += '<tr><td>-</td><td>' + obl + '</td></tr>'; 
    for(let city in sorted[obl]) 
        document.getElementById("res2").innerHTML += '<tr><td>--</td><td>' + sorted[obl][city] + '</td></tr>'; 
}
<table id = 'res2'></table>

Answer 2

Предлагаю решение "в лоб", набросал такую функцию:

function groupBy(array, fieldName) {
    var result = [];
    var currentArray = array;
    while(currentArray.length > 0) {
        var element = currentArray[0];
        var groupValue = element[fieldName];
        var values = currentArray.filter(function (value) {
                return value[fieldName] == groupValue;
            });
        currentArray = currentArray.filter(function (value) {
            return value[fieldName] != groupValue;
        });
        values = values.map(function (value) {
            delete value[fieldName];
            return value;
        });
        result.push({
            group : groupValue,
            values : values
        });
    }
    return result;
}

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

Пример

READ ALSO
Поиск по массиву JavaScript

Поиск по массиву JavaScript

У меня имеется массив на JS содержащий в себе числовые значения:

339
props to options react apollo

props to options react apollo

Нужно передать userID которая поступает в компонент из вне через props в переменную в запросе USER_QUERYПриведенный ниже пример не работает, как все...

241
onclick срабатывает один раз

onclick срабатывает один раз

почему onclick один раз срабатывает )в форме если что добавляется textarea потом как нажимается крестик чтобы закрыть формуудаляется и textarea )я уже...

511