Группировка элементов в массиве по нескольким свойствам - PullRequest
0 голосов
/ 26 мая 2018

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

var arr = [
{"type":"color","pid":"ITEM_1","id":"ITEM_1_1"},
{"type":"color","pid":"ITEM_2","id":"ITEM_2_2"},
{"type":"size","pid":"DEFAULT_0","id":"DEFAULT_0_1"},
{"type":"size","pid":"DEFAULT_0","id":"DEFAULT_0_2"}
]

И я хочу, чтобы новый массив выглядел так:

[
  {
    "type": "color",
    "relation":[{"pid": "ITEM_1", "id": "ITEM_1_1"},
          {"pid": "ITEM_2", "id": "ITEM_2_2"}]
  }, {
    "type": "size",
    "relation":[{"pid": "DEFAULT_0", "id": ["DEFAULT_0_1","DEFAULT_0_2"]}]
  }
]

Спасибо.

===100 Спасибо, ответ Абрара.Я слегка настраиваю его для группировки одинаковых элементов pid и получаю желаемый результат.Но должен быть лучший способ сделать это?

const arr = [
  {"type":"color","pid":"ITEM_1","id":"ITEM_1_1"},
  {"type":"color","pid":"ITEM_2","id":"ITEM_2_2"},
  {"type":"size","pid":"DEFAULT_0","id":"DEFAULT_0_1"},
  {"type":"size","pid":"DEFAULT_0","id":"DEFAULT_0_2"}
];

const resultArr = [];
const groups =[];
arr.forEach((data) => {
  let type = data.type;
  let newArr = arr.filter(el => el.type === type);
  let resObj = {
    "type": type,
    "relation": []
  };

  newArr.forEach(el => {
    groups.push({"pid": el.pid, "id": el.id});
  });

            var group_to_values = groups.reduce(function(obj, item) {
                obj[item.pid] = obj[item.pid] || [];
                obj[item.pid].push(item.id);
                return obj;
            }, {});
            resObj.relation.push(group_to_values);

  if (resultArr.map(e => e.type).indexOf(type) < 0) {
    resultArr.push(resObj);
  }
})

console.log(resultArr); 

1 Ответ

0 голосов
/ 26 мая 2018

Я реорганизовал ваш код, и теперь он выглядит следующим образом -

const arr = [
  {"type":"color","pid":"ITEM_1","id":"ITEM_1_1"},
  {"type":"color","pid":"ITEM_2","id":"ITEM_2_2"},
  {"type":"size","pid":"DEFAULT_0","id":"DEFAULT_0_1"},
  {"type":"size","pid":"DEFAULT_0","id":"DEFAULT_0_2"}
];


const resultArr = [];
arr.forEach((data) => {
  let type = data.type;
  let newArr = arr.filter(el => el.type === type);
  let resObj = {
    "type": type,
    "relation": []
  };
  newArr.forEach(el => {
    resObj.relation.push({"pid": el.pid, "id": el.id});
  });

  if (resultArr.map(e => e.type).indexOf(type) < 0) {
    resultArr.push(resObj);
  }
})

console.log(resultArr); //resultArr contains your desired output

В основном я отфильтровал ключи из массива на основе type, поскольку он должен быть уникальным (согласно вашемужелаемый вывод).Это должно быть довольно просто и не потребует фреймворков или даже jQuery.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...