首页 > 解决方案 > LINQ Group by & Select FirstOrDefault() 的 Lodash 或 JavaScript 等效项

问题描述

我有商店列表AuthorizationOrder,我需要firstOrDefault在 JavaScript 中提取分组集合的值。

eg: storeDto : { StoreNumber = 1 , Warehouse = 4201, AuthorizationOrder = 1 },
               { StoreNumber = 2 , Warehouse = 4201, AuthorizationOrder = 2 },
               { StoreNumber = 1 , Warehouse = 4202, AuthorizationOrder = 2 },
               { StoreNumber = 1 , Warehouse = 4203, AuthorizationOrder = 3 },
               { StoreNumber = 2 , Warehouse = 4207, AuthorizationOrder = 1 }

使用 LINQ:

warehouseStoreList = warehouseStoreList.GroupBy(x => x.StoreNumber)
      .Select(g => g.OrderBy(x => x.AuthorizationOrder).FirstOrDefault()).ToList();


Result: { StoreNumber = 1 , Warehouse = 4201, AuthorizationOrder = 1 },
        { StoreNumber = 2 , Warehouse = 4207, AuthorizationOrder = 1 }

我如何使用Lodash或 JavaScript 进行类似的操作,通过在存储上分组来提取数据,在排序后获取第一个值AuthorizationOrder

另外,获取带有关联商店的仓库。请参阅使用 LINQ 实现的小提琴

小提琴:https ://dotnetfiddle.net/glC1ij

想用 JavaScript 或 Lodash 实现同样的目标。

标签: javascripttypescriptlodash

解决方案


您可以使用reduce基于StoreNumber. 创建一个具有唯一性的累加器,每个唯一性StoreNumber作为键,如下所示:

{
  "1": {
    "StoreNumber": 1,
    "Warehouse": 4201,
    "AuthorizationOrder": 1
  },
  "2": {
    "StoreNumber": 2,
    "Warehouse": 4207,
    "AuthorizationOrder": 1
  }
}

key如果不存在或当前AuthorizationOrder小于累加器的值,则更新该值。然后用于Object.values()获取数组的值:

const array = [{StoreNumber:1,Warehouse:4201,AuthorizationOrder:1},{StoreNumber:2,Warehouse:4201,AuthorizationOrder:2},{StoreNumber:1,Warehouse:4202,AuthorizationOrder:2},{StoreNumber:1,Warehouse:4203,AuthorizationOrder:3},{StoreNumber:2,Warehouse:4207,AuthorizationOrder:1}]

const grouped = array.reduce((acc, o) => {
  let group = acc[o.StoreNumber];
  
  if(!group || group.AuthorizationOrder > o.AuthorizationOrder)
    acc[o.StoreNumber] = o;

  return acc;
}, {})

console.log(Object.values(grouped))


推荐阅读