Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Сгруппировать элементы (https://javascript.ru/forum/misc/62250-sgruppirovat-ehlementy.html)

tai 01.04.2016 12:03

Сгруппировать элементы
 
Добрый день!
Помогите сгруппировать элементы.

Есть массив объектов:

[
{areaCode: "019-001", areaName: "019-001", status: "НЕ-ПРОВЕРЯЛСЯ", amount: 8},
{areaCode: "019-001", areaName: "019-001", status: "ПРОВЕРЕН", amount: 103},
{areaCode: "019-006", areaName: "019-006", status: "В-СТАДИИ-ПРОВЕРКИ", amount: 2},
{areaCode: "019-006", areaName: "019-006", status: "ПРОВЕРЕН", amount: 89},
{areaCode: "019-006", areaName: "019-006", status: "НЕ-ПРОВЕРЯЛСЯ", amount: 89}
]


Из него нужно получить такой массив

[
{areaCode: "019-001", areaName: "019-001", status1: "НЕ-ПРОВЕРЯЛСЯ", amount: 8, status2: "ПРОВЕРЕН", amount: 103},
{areaCode: "019-006", areaName: "019-006", status1: "В-СТАДИИ-ПРОВЕРКИ", amount: 2,  status2: "ПРОВЕРЕН", amount: 89, status3: "НЕ-ПРОВЕРЯЛСЯ", amount: 89}
]

рони 01.04.2016 12:42

Цитата:

Сообщение от tai
Из него нужно получить такой массив

не получится ... одно свойство не может дублироватся в обьекте

Dilettante_Pro 01.04.2016 14:57

Получится вот такой
var arrnew = [
                    { areaCode: "019-001", areaName: "019-001", statcond: [ {status: "НЕ-ПРОВЕРЯЛСЯ", amount: 8 },
                                                                            {status: "ПРОВЕРЕН", amount: 103 }]},
                    { areaCode: "019-006", areaName: "019-006", statcond: [ {status: "В-СТАДИИ-ПРОВЕРКИ", amount: 2 },
                                                                            {status: "ПРОВЕРЕН", amount: 89 },
                                                                            {status: "НЕ-ПРОВЕРЯЛСЯ", amount: 89 }]}
       ];
       alert(arrnew[1].statcond[1].status + ' ' + arrnew[1].statcond[1].amount );

tai 01.04.2016 15:38

А как можно получить его в таком виде?

var newArr2 = data.sort(function(a,b){return a.areaCode < b.areaCode ? -1 : 1;}).reduce(function(arr, el){
                    if(!arr.length || arr[arr.length - 1].areaCode != el.areaCode) {
                        el.statcond = {
                            status: el.status,
                            amount: el.amount
                        };
                        arr.push(el);
                    }
                    return arr;
                }, []);
                console.log( newArr2 );

Dilettante_Pro 01.04.2016 16:44

tai,
Вот пример алгоритма формирования:
var arr = [
                    { areaCode: "019-001", areaName: "019-001", status: "НЕ-ПРОВЕРЯЛСЯ", amount: 8 },
                    { areaCode: "019-001", areaName: "019-001", status: "ПРОВЕРЕН", amount: 103 },
                    { areaCode: "019-006", areaName: "019-006", status: "В-СТАДИИ-ПРОВЕРКИ", amount: 2 },
                    { areaCode: "019-006", areaName: "019-006", status: "ПРОВЕРЕН", amount: 89 },
                    { areaCode: "019-006", areaName: "019-006", status: "НЕ-ПРОВЕРЯЛСЯ", amount: 89 }
                  ];

       var i = 0, j = 0, k = 0, arrnew = [];
       while (i < arr.length) {
           if (!arrnew[j]) {
               k = 0;
               arrnew[j] = { areaCode: arr[i].areaCode,
                   areaName: arr[i].areaName,
                   statcond: { status: arr[i].status,
                               amount: arr[i].amount
                   }
               };
          }
          else {
              if (arrnew[j].areaCode == arr[i].areaCode) {
                 arrnew[j].statcond[k] = { status: arr[i].status,
                                           amount: arr[i].amount };
                 k++;
                 i++;
              }
              else {
                  j++;
              }    
          }
       }
    alert(arrnew[1].statcond[1].status + ' ' + arrnew[1].statcond[1].amount);

А ваш алгоритм - не знаю, смотреть надо...


Часовой пояс GMT +3, время: 09:25.