Эквивалент Lodash или JavaScript для LINQ Group от & Select FirstOrDefault () - PullRequest
1 голос
/ 06 мая 2019

У меня есть список магазинов с 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

Fiddle: https://dotnetfiddle.net/glC1ij

Хотите добиться того же с помощью JavaScript или Lodash.

Ответы [ 3 ]

1 голос
/ 06 мая 2019

Вы можете сделать это в следующих шагах:

  • Применить reduce() к массиву объекта и установить аккумулятор в пустой объект {}.
  • Ключи объекта будут storeNumber, а значением будут объекты.
  • Проверьте, больше ли AuthorizationOrder уже существующего объекта в конкретном ключе, чем AuthorizationOrder элемента, который мы перебираем, затем измените значение этого ключа на текущий элемент. В противном случае не меняйте его.
  • Наконец, используйте Object.values(), чтобы получить массив объектов.

const arr = [{ 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 res = arr.reduce((ac,a) => {
  let ao = a.AuthorizationOrder
  let ao2 = (ac[a.StoreNumber] || {}).AuthorizationOrder || Infinity 
  if(ao < ao2) ac[a.StoreNumber] = a;
  return ac
},{});

console.log(Object.values(res))
1 голос
/ 06 мая 2019

Вы можете использовать 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))
0 голосов
/ 07 мая 2019

С помощью lodash / fp вы можете сгруппировать элементы по StoreNumber, а затем сопоставить каждую группу с элементом с минимальным значением AuthorizationOrder:

const { flow, groupBy, map, minBy } = _

const fn = flow(
  groupBy('StoreNumber'),
  map(minBy('AuthorizationOrder'))
)

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 result = fn(array)

console.log(result)
<script src='https://cdn.jsdelivr.net/g/lodash@4(lodash.min.js+lodash.fp.min.js)'></script>
...