将数据包装为对象形式

Ank*_*kit 0 javascript ecmascript-6

我有这样的数据集:

[ { city: 'a', value: 1, sector: 'Hospital' },
  { city: 'b', value: 1, sector: 'Hardware' },
  { city: 'c', value: 1, sector: 'Hardware' },
  { city: 'd', value: 1, sector: 'Networking' },
  { city: 'e', value: 1, sector: 'Hospital' },
  { city: 'f', value: 1, sector: 'Education' },
  { city: 'g', value: 1, sector: 'Transport' },
  { city: 'h', value: 1, sector: 'Food' },
  { city: 'i', value: 1, sector: 'Networking' },
  { city: 'j', value: 0.7, sector: 'Software' },
  { city: 'k', value: 0.7, sector: 'Education' },
  { city: 'l', value: 0.7, sector: 'Food' },
  { city: 'm', value: 0.7, sector: 'Hospital' },
  { city: 'n', value: 0.2, sector: 'Networking' },
  { city: 'o', value: 0.2, sector: 'Networking' },
  { city: 'p', value: 0.2, sector: 'Industrial' },
  { city: 'q', value: 0.2, sector: 'Transport' },
  { city: 'r', value: 0.2, sector: 'Software' } ]
Run Code Online (Sandbox Code Playgroud)

现在我想将对象数组转换为具有Array的对象,具有相同重复扇区的城市应该属于特定组.

期望的输出如下:

[
 {
  sector: "Hospital",
  place: ["a", "e", "m"]
 },
 {
  sector: "Hardware",
  place: ["b", "c"]
 },
 {
  sector: "Networking",
  place: ["d", "i", "n", "o"]
 },
 {
  sector: "Education",
  place: ["f", "k"]
 },
 {
  sector: "Transport",
  place: ["g", "q"]
 },
 {
  sector: "Food",
  place: ["h", "l"]
 },
 {
  sector: "Software",
  place: ["j", "r"]
 },
 {
  sector: "Industrial",
  place: ["q"]
 },
]
Run Code Online (Sandbox Code Playgroud)

有谁建议我如何做这种类型的任务.任何帮助或建议真的很感激.

我有一个线索,这个事情将通过reduce和map函数来完成,但是这将是什么样的挑战.

我试图让扇区重复计数如此,但没有实现我想要的输出:

let x = data.reduce((m, c) => {
  if (c.sector in m) m[c.sector].count += 1;
   else m[c.sector] = { sector: c.sector, count: 1 };
   return m;
}, {});
console.log(x)
Run Code Online (Sandbox Code Playgroud)

Ale*_*xis 5

您可以先提取所有uniq扇区array.

之后map进入每个扇区并filter在您的数据中对应哪个位置.

var data = [{ city: 'a', value: 1, sector: 'Hospital' },
  { city: 'b', value: 1, sector: 'Hardware' },
  { city: 'c', value: 1, sector: 'Hardware' },
  { city: 'd', value: 1, sector: 'Networking' },
  { city: 'e', value: 1, sector: 'Hospital' },
  { city: 'f', value: 1, sector: 'Education' },
  { city: 'g', value: 1, sector: 'Transport' },
  { city: 'h', value: 1, sector: 'Food' },
  { city: 'i', value: 1, sector: 'Networking' },
  { city: 'j', value: 0.7, sector: 'Software' },
  { city: 'k', value: 0.7, sector: 'Education' },
  { city: 'l', value: 0.7, sector: 'Food' },
  { city: 'm', value: 0.7, sector: 'Hospital' },
  { city: 'n', value: 0.2, sector: 'Networking' },
  { city: 'o', value: 0.2, sector: 'Networking' },
  { city: 'p', value: 0.2, sector: 'Industrial' },
  { city: 'q', value: 0.2, sector: 'Transport' },
  { city: 'r', value: 0.2, sector: 'Software' } ];
  
  
  var sectors = [];
  
  data.map(d => {
    if(sectors.indexOf(d.sector) === -1){
       sectors.push(d.sector);
    }
  })
  
  sectors = sectors.map(sector => {
     return {
        sector,
        places:data.filter(d => d.sector === sector).map(d => d.city)
     }
  });
  
  console.log(sectors)
Run Code Online (Sandbox Code Playgroud)

  • 是的,这两个工作和这个解决方案很好地工作:)只是想要注意,`map`的这种用法是一种反模式,在这种情况下`forEach`是首选方法. (2认同)