Динамически создавать новый объект (ы) из данных JSON - PullRequest
0 голосов
/ 06 марта 2019

Из сервисного вызова я получаю аналогичные данные JSON, как показано ниже:

myArray: any = [
{item: 'Jelly Beans', areaCode: 321, Company: "Bob's Candy"},
{item: 'Skittles', areaCode: 444, Company: "Jim's Candy"},
{item: 'Snickers', areaCode: 321, Company: "Bob's Candy"},
{item: 'M&Ms', areaCode: 444, Company: "Jim's Candy"},
{item: 'Gummy Bears', areaCode: 123, Company: "Sally's Candy"}];

Мне нужно динамически разбить это на несколько массивов объектов на основе areaCode.

Или создатьНовый объект динамически основан на areaCode.

this.myArray= this.data.map(item => item.areaCode)
.filter((value, index, self) => self.indexOf(value) === index);

У меня есть мысли об использовании функции карты и ее фильтрации на основе areaCode, а затем, возможно, создании нового объекта с массивами на основе areaCode.Я просто не могу обернуться вокруг процесса.Если бы кто-нибудь мог дать совет, я был бы признателен.

Ответы [ 2 ]

1 голос
/ 06 марта 2019

Вместо этого вы можете использовать .reduce для преобразования вашего массива в объект, а затем использовать Object.values() для получения вашего массива уникальных объектов из объекта Reduces, например:

const arr = [
{item: 'Jelly Beans', areaCode: 321, Company: "Bob's Candy"},
{item: 'Skittles', areaCode: 444, Company: "Jim's Candy"},
{item: 'Snickers', areaCode: 321, Company: "Bob's Candy"},
{item: 'M&Ms', areaCode: 444, Company: "Jim's Candy"},
{item: 'Gummy Bears', areaCode: 123, Company: "Sally's Candy"}];

const res = Object.values(arr.reduce((acc, {item, areaCode, Company}) => {
  if(areaCode in acc) {
    acc[areaCode].item.push(item);
  } else {
    acc[areaCode] = {item: [item], areaCode, Company};
  };
  
  return acc;
}, {}));

console.log(res);
1 голос
/ 06 марта 2019

вы ожидаете что-то подобное в качестве вывода

{
"123":[{"item":"Gummy Bears","areaCode":123,"Company":"Sally's Candy"}],
  "321":[{"item":"Jelly Beans","areaCode":321,"Company":"Bob's Candy"}, 
         {"item":"Snickers","areaCode":321,"Company":"Bob's Candy"}],
  "444":[{"item":"Skittles","areaCode":444,"Company":"Jim's Candy"}, 
         {"item":"M&Ms","areaCode":444,"Company":"Jim's Candy"}]
}

, тогда вы можете уменьшить его для достижения

const output = myArray.reduce((res,v) => {
    if(!res[v.areaCode]) {
        res[v.areaCode] = [v] 
    } else {
    res[v.areaCode].push(v)
    }
return res
},{} )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...