4
votes

création d'identifiant unique pour chaque objet

Présentation : il existe un tableau d'objets groupe de produits et chaque groupe de produits a un tableau de articles . Objet de groupe de produits ayant un ID unique, mais le tableau d'éléments n'a pas d'ID unique attribué. Veuillez trouver ci-dessous l'objet JSON.

const productList = [{
  productGroup : 'PG1',
  index: 1,
  items: [{
    item1: 'item1 value',
    item2: 'item2 value'
  },{
    item1: 'item1 value',
    item2: 'item2 value'
  },{
    item1: 'item1 value',
    item2: 'item2 value'
  }]
}, {
  productGroup : 'PG2',
  index: 2,
  items: [{
    item1: 'item1 value',
    item2: 'item2 value'
  },{
    item1: 'item1 value',
    item2: 'item2 value'
  }]
}];

const itemList = productList.map(obj => {
	obj.items.map((itemObj, index) => {
  	itemObj.productGroup = obj.productGroup;
    itemObj.pgIndex = obj.index;
    itemObj.itemIndex = obj.index + '' + index;
  });
  return obj.items;
});

var mergedListItems = itemList.reduce((arr, arrNext) => arr.concat(arrNext));

console.log('mergedListItems', mergedListItems);

Condition: Attribuez un identifiant unique pour chaque objet items du tableau items en fonction du groupe de produits .

J'ai essayé jusqu'à présent: solution de travail: index concat du produit groupe avec l'index de chaque élément de la liste

const productList = [{
  productGroup : 'PG1',
  index: 1,
  items: [{
    item1: 'item1 value',
    item2: 'item2 value'
  },{
    item1: 'item1 value',
    item2: 'item2 value'
  },{
    item1: 'item1 value',
    item2: 'item2 value'
  }]
}, {
  productGroup : 'PG2',
  index: 2,
  items: [{
    item1: 'item1 value',
    item2: 'item2 value'
  },{
    item1: 'item1 value',
    item2: 'item2 value'
  }]
}];

Cette approche est-elle bonne? Si non, pouvez-vous m'aider à trouver la meilleure approche pour ce faire.


2 commentaires

Quel est l ' id unique du groupe de produits, l' index ou la clé productGroup ?


Indice @Shidersz


4 Réponses :


1
votes

Vous pouvez .reduce dans le tableau de sortie immédiatement, plutôt que d'itérer plusieurs fois sur les éléments:

itemIndex: `${index}_${itemIndex}`

Notez également qu'il y a un problème potentiel avec votre logique

itemObj.itemIndex = obj.index + '_' + index;

- que faire si l'un des index est supérieur à 10? Ensuite, vous pouvez voir un élément avec un itemIndex de, par exemple, 111 . Qu'est-ce que cela signifie, est-ce que cela signifie que l'index de l'objet d'origine était 11 ou que l'index d'élément était 11? Si possible, pensez à mettre un trait de soulignement ou un séparateur entre eux, par exemple

itemObj.itemIndex = obj.index + '' + index;

Ou, en utilisant le modèle littéral comme dans mon code

const productList = [{
  productGroup : 'PG1',
  index: 1,
  items: [{
    item1: 'item1 value',
    item2: 'item2 value'
  },{
    item1: 'item1 value',
    item2: 'item2 value'
  },{
    item1: 'item1 value',
    item2: 'item2 value'
  }]
}, {
  productGroup : 'PG2',
  index: 2,
  items: [{
    item1: 'item1 value',
    item2: 'item2 value'
  },{
    item1: 'item1 value',
    item2: 'item2 value'
  }]
}];

const mergedListItems = productList.reduce((a, { productGroup, index, items }) => {
  items.forEach((itemObj, itemIndex) => {
    a.push({
      ...itemObj,
      productGroup,
      pgIndex: index,
      itemIndex: `${index}${itemIndex}`
    });
  });
  return a;
}, []);
console.log(mergedListItems);


0 commentaires

1
votes

Dans votre code, vous utilisez

const productList = [{
  productGroup : 'PG1',
  index: 1,
  items: [{
    item1: 'item1 value',
    item2: 'item2 value'
  },{
    item1: 'item1 value',
    item2: 'item2 value'
  },{
    item1: 'item1 value',
    item2: 'item2 value'
  }]
}, {
  productGroup : 'PG2',
  index: 2,
  items: [{
    item1: 'item1 value',
    item2: 'item2 value'
  },{
    item1: 'item1 value',
    item2: 'item2 value'
  }]
}];

let i=0;
productList.forEach(pr=>pr.items.forEach(x=> x.id = i++ ));

console.log(productList);

Ce qui peut ne pas être unique pour des cas comme obj.index = 12 index = 3 et obj.index = 1 index = 23 . Mais si vous remplacez '' par '-' , il sera unique.

Essayez d'ajouter le champ 'id' à chaque objet items comme suit id = productGroup.index + '-' + i (où i est l'index de l'élément dans le tableau)

let i=0;
productList.forEach(pr=>pr.items.forEach(x=> x.id = i++ ));

const productList = [{
  productGroup : 'PG1',
  index: 1,
  items: [{
    item1: 'item1 value',
    item2: 'item2 value'
  },{
    item1: 'item1 value',
    item2: 'item2 value'
  },{
    item1: 'item1 value',
    item2: 'item2 value'
  }]
}, {
  productGroup : 'PG2',
  index: 2,
  items: [{
    item1: 'item1 value',
    item2: 'item2 value'
  },{
    item1: 'item1 value',
    item2: 'item2 value'
  }]
}];

productList.forEach(pr=>pr.items.forEach((x,i)=> x.id = pr.index+'-'+i ));

console.log(productList);

Vous pouvez également créer un identifiant unique indépendant de productGroup.index

productList.forEach(pr=>pr.items.forEach((x,i)=> x.id = pr.index+'-'+i ));

itemObj.itemIndex = obj.index + '' + index;


2 commentaires

Merci. Puis-je savoir laquelle est la meilleure à utiliser parmi ces deux solutions?


@RohitJindal est meilleur / pire - cela dépend du contexte. La deuxième solution renvoie un nombre (moins d'espace, un traitement plus rapide) mais vous devez connaître des informations globales sur tous les éléments pour générer l'ID suivant. La première solution renvoie une chaîne (plus lente / plus d'espace) mais vous devez connaître uniquement les informations locales sur les éléments du projet en cours pour générer l'ID suivant.



0
votes

Ici, vous avez une approche utilisant réduire () et le flatMap () . J'ajouterai également le nom du produit au nouvel identifier:

const productList = [{
  productGroup : 'PG1',
  index: 1,
  items: [
    {item1: 'item1 value', item2: 'item2 value'},
    {item1: 'item1 value', item2: 'item2 value'},
    {item1: 'item1 value', item2: 'item2 value'}
  ]
},
{
  productGroup : 'PG2',
  index: 2,
  items: [
    {item1: 'item1 value', item2: 'item2 value'},
    {item1: 'item1 value', item2: 'item2 value'}
  ]
}];

let newList = productList.reduce((res, curr) =>
{
    let objs = curr.items.flatMap((x, idx) => Object.assign({
        productGroup: curr.productGroup,
        pgIndex: curr.index,
        itemIndex: [curr.productGroup, curr.index, idx].join("_")
    }, x));
    return res.concat(objs);
}, []);

console.log(newList);


0 commentaires

0
votes

Le code que j'ai écrit ci-dessous fera le travail pour vous et est une solution assez facile à visualiser. La solution nécessitait l'utilisation de boucles for imbriquées, car nous parcourons également le tableau d'éléments internes. J'ai ajouté quelques commentaires au code ci-dessous pour expliquer ce qui se passe.

      const productList = [{
      productGroup : 'PG1',
      index: 1,
      items: [{
        item1: 'item1 value',
        item2: 'item2 value'
      },{
        item1: 'item1 value',
        item2: 'item2 value'
      },{
        item1: 'item1 value',
        item2: 'item2 value'
      }]
    }, {
      productGroup : 'PG2',
      index: 2,
      items: [{
        item1: 'item1 value',
        item2: 'item2 value'
      },{
        item1: 'item1 value',
        item2: 'item2 value'
      }]
    }];

    var count;
    for(var char in productList){
        count = 1; // Will reset to 1 when we go to a new product group
        for(var i = 0; i < productList[char].items.length; i++){
            // Adding in the unique key to the items.
            productList[char].items[i].uniqueKey = productList[char].productGroup + "_" + count;
            count++; 
        }   
    }

J'espère que cela vous aidera: P Faites-moi savoir si vous avez des questions.


0 commentaires