1
votes

Lodash ou équivalent JavaScript pour LINQ Group by & Select FirstOrDefault ()

J'ai une liste de magasins qui ont AuthorizationOrder , je devrai extraire les valeurs firstOrDefault d'une collection groupée en JavaScript.

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 }

Utilisation de LINQ:

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 }

Comment puis-je effectuer une opération similaire en utilisant Lodash ou JavaScript pour extraire des données en les regroupant sur store, obtenez la première valeur après la commande sur AuthorizationOrder.

Aussi, obtenez les entrepôts avec les magasins associés. Veuillez consulter le violon implémenté à l'aide de LINQ

Fiddle: https://dotnetfiddle.net/glC1ij a>

Vous voulez réaliser la même chose avec JavaScript ou Lodash.


0 commentaires

3 Réponses :


1
votes

Vous pouvez utiliser réduire pour regrouper en fonction du StoreNumber . Créez un accumulateur avec chaque StoreNumber unique comme clé comme ceci:

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))

Mettez à jour la valeur si la clé n'existe pas ou n'est pas actuelle AuthorizationOrder est inférieur à celui de l'accumulateur. Utilisez ensuite Object.values ​​() code> pour obtenir uniquement les valeurs d'un tableau:

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


2 commentaires

pouvez-vous s'il vous plaît répondre comment attacher les magasins à l'entrepôt et supprimer les entrepôts si la liste de stockage est vide en javascript, ci-joint est le jsfiddle, je recherche un code équivalent javascript


@VijenderReddyChintalapudi, c'est une question complètement différente.



1
votes

Vous pouvez le faire en suivant les étapes suivantes:

  • Appliquez reduction () sur un tableau d'objets et définissez l'accumulateur sur un objet vide {} .
  • Les clés de l'objet seront storeNumber et la valeur des objets.
  • Vérifiez si le AuthorizationOrder de l'objet déjà présent à une clé particulière est supérieur au AuthorizationOrder de l'élément que nous itérons puis changez la valeur de cette clé en l'élément actuel . Sinon, ne le changez pas.
  • Enfin, utilisez Object.values ​​() pour obtenir un tableau d'objets.

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))


2 commentaires

pouvez-vous s'il vous plaît répondre comment attacher les magasins à l'entrepôt et supprimer les entrepôts si la liste de stockage est vide en javascript, ci-joint est le jsfiddle en utilisant LINQ, je recherche un code équivalent javascript


@Vijender: veuillez poser une nouvelle question à ce sujet (ce serait probablement trop large de toute façon).



0
votes

Avec lodash / fp, vous pouvez regrouper les éléments par StoreNumber , puis mapper chaque groupe à l'élément avec la valeur minimale de AuthorizationOrder :

<script src='https://cdn.jsdelivr.net/g/lodash@4(lodash.min.js+lodash.fp.min.js)'></script>
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)


0 commentaires