代码之家  ›  专栏  ›  技术社区  ›  CraZyDroiD

根据id分组数组数据

  •  1
  • CraZyDroiD  · 技术社区  · 5 年前

    通过API调用,我收到如下响应

    [
      {
        stationId: "10"
        name: "Jinbaolai"
        group: {id: "18", stationGroupName: "Ali"}
      },
      {
        stationId: "13"
        name: "Stack"
        group: {id: "18", stationGroupName: "Ali"}
      },
      {
        stationId: "20"
        name: "Overflow"
        group: {id: "19", stationGroupName: "Baba"}
      }
    
    ]
    

    如您所见,前两条记录由同一组组成。我想把这些数据按组分组。例如,它应该是这样的

    [
      {
        groupId: "18",
        groupName : "Ali",
        stations : [
                     {
                      stationId: "10",
                      name: "Jinbaolai"
                     },
                     {
                      stationId: "13",
                      name: "Stack"
                     }
                   ]
    
      },
      {
        groupId: "19",
        groupName : "Baba",
        stations : [
                     {
                      stationId: "20",
                      name: "Overflow"
                     },
                   ]
    
      }
    
    ]
    

    我想在我的reducer中进行分组逻辑,在这里我还设置了问题开头显示的完整数据数组。

                case EVC_SUCCESS:
                return {
                    ...state,
                    chargingStations: action.evcData.chargingStations,
                    chargingStationGroups: //This is where my logic should go. ('action.evcData.chargingStations' is the initial data array)
                    tableLoading: false
                }
    

    我该怎么做?我试过用 filter 但不成功。

    3 回复  |  直到 5 年前
        1
  •  4
  •   Thomas Junk    5 年前

    最好的方法是 Array.prototype.reduce()

    减少 是一个聚合函数,在这个函数中,您可以放入一个数组中的某些内容,然后获取一个vaule。

    可能有一个起始值作为我使用的最后一个参数 {} . 签名是 reduce(fn, startingValue) 哪里 fn 是一个包含两个参数的函数 aggregate currentValue 最后你把总数还回来。

    const groupData = (data)=> {
    
        return Object.values(data.reduce((group,n)=>{
        if (!group[n.group.id]){
            group[n.group.id] = {
          groupId:n.group.id,
          groupName: n.group.stationGroupName,
          stations:[]}
        } 
        group[n.group.id].stations.push({
          stationID: n.stationId,
          name: n.name
        })
        return group;
      }, {}))
    
    }
    

    这是 fiddle

        2
  •  1
  •   Thahzan    5 年前

    一个简单的JS算法可以帮你做到这一点

    const list = [
      {
        stationId: "10",
        name: "Jinbaolai",
        group: {id: "18", stationGroupName: "Ali"}
      },
      {
        stationId: "13",
        name: "Stack",
        group: {id: "18", stationGroupName: "Ali"}
      },
      {
        stationId: "20",
        name: "Overflow",
        group: {id: "19", stationGroupName: "Baba"}
      }
    
    ];
    const groups = {};
    
    list.forEach((item) => {
      const groupId = item.group.id;
      const group = groups[groupId] || {groupId: groupId, groupName: item.group.stationGroupName, stations: []};
    
      group.stations.push({stationId: item.stationId, name: item.name});
      groups[groupId] = group;
    });
    
    const groupedArray = Object.keys(groups).map((groupId) => groups[groupId]);
    
    console.log(groupedArray); // This will be the output you want
    
        3
  •  0
  •   Arjun Kava    5 年前

    我认为链接多个函数是可行的。

    const stations = [
      {
        "stationId": 10,
        "name": "Jinbaolai",
        "group": {"id": "18", "stationGroupName": "Ali"}
      },
      {
        "stationId": 13,
        "name": "Stack",
        "group": {"id": 18, "stationGroupName": "Ali"}
      },
      {
        "stationId": 20,
        "name": "Overflow",
        "group": {"id": "19", "stationGroupName": "Baba"}
      }
    ]
    const groups = _.chain(stations)
    .groupBy((station) => { return station.group.id })
    .map((values, key) => { 
      return {
        "groupId": _.first(values).group.id,
        "groupName": _.first(values).group.id,
        "stations": _.map(values,(value)=>{ return { "stationId": value.stationId, "name": value.name   } })
      }
    })
    console.log("groups",groups)
    <script src="https://cdn.jsdelivr.net/npm/lodash@4.17.15/lodash.min.js"></script>
    推荐文章