Группировка по уникальному ключу в массиве объекта - PullRequest
1 голос
/ 28 мая 2020

Я работаю над небольшим проектом React, где застрял на этом этапе. Мне нужно сделать группировку на основе ключа объекта массива.

Ниже представлен массив:

   let addOnFeatures = [
    {"name": "feature1", id: 101, cost: 100},
    {"name": "feature2", id: 102, cost: 200},
    {"name": "feature1", id: 103, cost: 300},
    {"name": "feature3", id: 104, cost: 40}
    ]

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

Ожидаемый результат должен быть похож на

*uniqueFeaturename
id: cost

Пример:

 1. feature1
   101 : 100
   103 : 300
 2. feature2
    102 : 200
 3. feature3
    104: 40

Ответы [ 2 ]

2 голосов
/ 28 мая 2020

Просто используйте Array.prototype.reduce и добавьте элементы к объекту, например

let addOnFeatures = [
    {"name": "feature1", id: 101, cost: 100},
    {"name": "feature2", id: 102, cost: 200},
    {"name": "feature1", id: 103, cost: 300},
    {"name": "feature3", id: 104, cost: 40}
]

const res = addOnFeatures.reduce((acc, item) => {
   if(acc[item.name]) {
      acc[item.name] = {...acc[item.name], [item.id]: item.cost};
   } else {
      acc[item.name] = {[item.id]: item.cost};
   }
   return acc;
}, {});

console.log(res);
0 голосов
/ 28 мая 2020

Одно из решений может быть таким:

 let addOnFeatures = [
    {"name": "feature1", id: 101, cost: 100},
    {"name": "feature2", id: 102, cost: 200},
    {"name": "feature1", id: 103, cost: 300},
    {"name": "feature3", id: 104, cost: 40}
    ];
    
    var res={}; 
    addOnFeatures.forEach(i=>{
    
       if(!res[i.name]){
         res[i.name] = [{id: i.id, cost:i.cost}]
       }else{
        res[i.name].push({id: i.id, cost:i.cost})
       }
    }
    );
    
    console.log(res)
Или это

 let addOnFeatures = [
    {"name": "feature1", id: 101, cost: 100},
    {"name": "feature2", id: 102, cost: 200},
    {"name": "feature1", id: 103, cost: 300},
    {"name": "feature3", id: 104, cost: 40}
    ];
    
   var res2={}; 
    addOnFeatures.forEach(i=>{
        res2[i.name] = res2[i.name] ? [...res2[i.name],...[{id: i.id, cost:i.cost}]] :[...[{id: i.id, cost:i.cost}]]
    }
    );
    
    console.log(res2)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...