1
votes

problème Itération à travers un objet de niveau profond en javascript

J'essayais un simple morceau de code dans lequel un tableau d'objets est présent et chaque objet a un autre tableau de produits (avec des valeurs en double). Je voulais combiner toutes les gammes de produits ensemble sans aucun doublon. Déjà atteint la moitié du processus d'itération mais impossible de supprimer les doublons, y a-t-il un moyen d'itérer les valeurs (car il a lui-même une valeur de clé comme objet 1 et ses données ..)

Veuillez suggérer toute autre méthode optimisée si possible. Je suis nouveau dans JavaScript alors pardonnez toutes les erreurs stupides faites Merci d'avance.

 entrez la description de l'image ici


0 commentaires

3 Réponses :


1
votes

Vous pouvez le faire en utilisant concat , Set et Array.from:

const object1 = { products: ['1', '2', '3'] }
const object2 = { products: ['1', '2', '3', '4'] }
const object3 = { products: ['5'] }

// Merge all the products in one Array
const products = object1.products
  .concat(object2.products)
  .concat(object3.products);

// Create a Set, with the unique products
const set = new Set(products);

// Convert the Set to an Array
const uniqueProducts = Array.from(set);

console.log(uniqueProducts)


5 commentaires

arr.forEach ((value, index, arr) => {array.push (value.object1.products, value.object2.products, val‌ ue.object3.products)}) console.log ("arr after concat" + array) var set = new Set (tableau); console.log (set) const unique = Array.from (set); console.log ("tableau le plus récent:" + unique) a essayé d'ajouter ce morceau de sortie de code est encore le même.


SORTIE: arr après concat str1, str2, str3, str2, str5, str5, str4, str5, str6, str7, str7, str8, ‌ str9 Set {['str1', 'str2', 'str3', 'str2' , 'str5', 'str5'], ['str4', 'str5', 'str6', 'str7'], ['str7', 'str8', 'str9']} tableau le plus récent: str1, str2, str3 , str2, str5, str5, str4, str5, str6, str7, str7, str8, ‌ str9


Vous n'avez pas besoin d'utiliser forEach et vous devez envoyer un tableau plat au Set . Essayez simplement de comprendre et de suivre strictement mon exemple ci-dessus et de l'appliquer à votre cas d'utilisation. Si vous exécutez l'extrait de code ci-dessus, vous verrez qu'il fonctionne correctement.


Cela fonctionne bien avec votre chemin.Merci .Mais si nous avons 10 objets, comment pouvons-nous l'itérer dans son niveau profond pour obtenir la gamme de produits.


Si vous avez beaucoup d'objets (au lieu de seulement 3), alors il est raisonnable de les parcourir et de créer un nouveau tableau plat résultant, puis de passer le tableau au Set . Vous pouvez itérer avec n'importe quelle fonction JS que vous voulez, mais je préférerais utiliser reduction ou forEach . Si la réponse vous a aidé, vous pouvez envisager de l'accepter. Merci! :)



0
votes

Pour supprimer les doublons, vous pouvez utiliser Set , il garde tous les éléments uniques, puis vous pouvez les convertir en Array .

Array.from(new Set(array))

p >


0 commentaires

0
votes

il existe de nombreuses façons d'y parvenir:

  1. vous pouvez utiliser un filtre pour supprimer les éléments en double:

https: / /developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter en lisant en valeur, son index et son tableau en fonction de filtre

un lien de recherche rapide: https://codeburst.io/javascript-array-distinct-5edc93501dc4

  1. vous pouvez toujours écrire une méthode de fusion qui serait bonne en termes de gestion des erreurs, de vérification des cas d'angle, de sorte que l'action ci-dessus ne se traduise pas par une erreur, exemple:

function MergeUniqueProductFromDictToArry(fromDict, productKey, toArray) {
  //check if for the array in which we need to merge
  if(!toArray) {
    toArray = [];
  }
  //check for validity
  if(!fromDict || !productKey || !fromDict[productKey] || fromDict[productKey].length == 0) {
    return toArray;
  }  
  for(var ix in fromDict[productKey]) {
    //check if product already exist
    if(toArray.indexOf(fromDict[productKey][ix]) === -1) {
      toArray.push(fromDict[productKey][ix]);
    }
  }
  return toArray;
}
var object1 = {products: ["p1", "p2", "p1"]};
var object2 = {products: ["p3", "p2"]};
var object3 = {products: ["p4", "p2"]};
var uniqueProducts = MergeUniqueProductFromDictToArry(object1, "products", null);
uniqueProducts = MergeUniqueProductFromDictToArry(object2, "products", uniqueProducts);
uniqueProducts = MergeUniqueProductFromDictToArry(object3, "products", uniqueProducts);
console.log(uniqueProducts);


0 commentaires