2017-10-03 4 views
1

Je cherche un moyen de combiner des objets dans des tableaux en fonction de valeurs d'ID. Je peux le faire fonctionner en utilisant le filter method pour le niveau supérieur, mais je ne sais pas comment m'assurer que tous les sous-groupes et autres sont correctement fusionnés. Voici un exemple:Fusionner des objets multidimensionnels dupliqués dans un tableau d'objets

[ 
    { 
     id: 1, 
     name: "A" 
     subGroup: [ 
      { 
       id: 1, 
       name: "AA" 
      } 
     ] 
    }, 
    { 
     id: 2, 
     name: "B" 
     subGroup: [ 
      { 
       id: 4, 
       name: "DD" 
      } 
     ] 
    }, 
    { 
     id: 1, 
     name: "A" 
     subGroup: [ 
      { 
       id: 2, 
       name: "BB" 
      } 
     ] 
    }, 
    { 
     id: 3, 
     name: "C" 
     subGroup: [ 
      { 
       id: 5, 
       name: "EE" 
      } 
     ] 
    }, 
    { 
     id: 2, 
     name: "B" 
     subGroup: [ 
      { 
       id: 4, 
       other: "Something else" 
      } 
     ] 
    }, 
    { 
     id: 1, 
     name: "A" 
     subGroup2: [ 
      { 
       id: 7, 
       name: "GG" 
      } 
     ] 
    }, 
    { 
     id: 1, 
     name: "A" 
     subGroup: [ 
      { 
       id: 1, 
       name: "AA", 
       subSubGroup: [ 
        id: 10, 
        name: "II", 
       ] 
      } 
     ] 
    } 
] 

Je cherche à prendre quelque chose comme ça et fusionner comme:

[ 
    { 
     id: 1, 
     name: "A" 
     subGroup: [ 
      { 
       id: 1, 
       name: "AA", 
       subSubGroup: [ 
        id: 10, 
        name: "II", 
       ] 
      }, 
      { 
       id: 2, 
       name: "BB" 
      } 
     ], 
     subGroup2: [ 
      { 
       id: 7, 
       name: "GG" 
      } 
     ] 
    }, 
    { 
     id: 2, 
     name: "B" 
     subGroup: [ 
      { 
       id: 4, 
       name: "DD", 
       other: "Something else" 
      } 
     ] 
    }, 
    { 
     id: 3, 
     name: "C" 
     subGroup: [ 
      { 
       id: 5, 
       name: "EE" 
      } 
     ] 
    } 
] 

Toute aide serait appréciée.

+0

Quelles sont vos structures de données initiales? – Burimi

+0

Le premier extrait de code est les données initiales et le second est comment je cherche à l'installer. – fanfavorite

+0

Quelle est la relation entre les données? – Burimi

Répondre

1

Vous pouvez utiliser une approche récursive pour les propriétés qui sont des tableaux et un groupe sur les propriétés id et name.

var data = [{ id: 1, name: "A", subGroup: [{ id: 1, name: "AA" }] }, { id: 2, name: "B", subGroup: [{ id: 4, name: "DD" }] }, { id: 1, name: "A", subGroup: [{ id: 2, name: "BB" }] }, { id: 3, name: "C", subGroup: [{ id: 5, name: "EE" }] }, { id: 2, name: "B", subGroup: [{ id: 4, other: "Something else" }] }, { id: 1, name: "A", subGroup2: [{ id: 7, name: "GG" }] }, { id: 1, name: "A", subGroup: [{ id: 1, name: "AA", subSubGroup: [{ id: 10, name: "II" }] }] }], 
 
    result = []; 
 

 
data.forEach(function iter(r) { 
 
    return function (o) { 
 
     var ref = r.find(p => o.id === p.id && o.name === p.name); 
 
     if (!ref) { 
 
      r.push(o); 
 
      return; 
 
     } 
 
     Object 
 
      .keys(o) 
 
      .filter(k => Array.isArray(o[k])) 
 
      .forEach(k => o[k].forEach(iter(ref[k] = ref[k] || []))); 
 
    }; 
 
}(result)); 
 

 
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

+0

Merci Nina. Juste un FYI à quiconque regarde est que c'est le code ES6, mais fonctionne très bien! – fanfavorite