Динамическое создание нового объекта (ов) из данных JSON

#arrays #json #angular #typescript #ecmascript-6

#массивы #json #angular #typescript #ecmascript-6

Вопрос:

При вызове службы я получаю аналогичные данные 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: 'Mamp;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);
  

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

Комментарии:

1. Каков ожидаемый результат?

Ответ №1:

вы ожидаете что-то вроде этого в качестве выходных данных

 {
"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":"Mamp;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
},{} )
  

Ответ №2:

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

 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: 'Mamp;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);