0

J'ai le tableau d'objets suivant. Ce que je dois faire, c'est simplement supprimer les paires clé-valence de tous les tableaux de connecteurs.supprimer les éléments en double d'un tableau d'objets - es6?

[ 
     { 
      "connector":[ 
      { 
       "name":"CC1" 
      }, 
      { 
       "name":"App1" 
      }, 
      { 
       "name":"CC1" 
      }, 
      { 
       "name":"App2" 
      }, 
      { 
       "name":"CC1" 
      }, 
      { 
       "name":"App3" 
      } 
      ], 
      "connections":[ 
      { 
       "source":"CC1", 
       "target":"App1" 
      }, 
      { 
       "source":"CC1", 
       "target":"App2" 
      }, 
      { 
       "source":"CC1", 
       "target":"App3" 
      } 
      ] 
     }, 
     { 
      "connector":[ 
      { 
       "name":"CC1" 
      }, 
      { 
       "name":"App1" 
      }, 
      { 
       "name":"CC1" 
      }, 
      { 
       "name":"App2" 
      }, 
      { 
       "name":"CC1" 
      }, 
      { 
       "name":"App3" 
      } 
      ], 
      "connections":[ 
      { 
       "source":"CC1", 
       "target":"App1" 
      }, 
      { 
       "source":"CC1", 
       "target":"App2" 
      }, 
      { 
       "source":"CC1", 
       "target":"App3" 
      } 
      ] 
     }, 
     { 
      "connector":[ 
      { 
       "name":"CC1" 
      }, 
      { 
       "name":"App1" 
      }, 
      { 
       "name":"CC1" 
      }, 
      { 
       "name":"App2" 
      }, 
      { 
       "name":"CC1" 
      }, 
      { 
       "name":"App3" 
      } 
      ], 
      "connections":[ 
      { 
       "source":"CC1", 
       "target":"App1" 
      }, 
      { 
       "source":"CC1", 
       "target":"App2" 
      }, 
      { 
       "source":"CC1", 
       "target":"App3" 
      } 
      ] 
     }, 
     { 
      "connector":[ 
      { 
       "name":"CC2" 
      }, 
      { 
       "name":"App2" 
      } 
      ], 
      "connections":[ 
      { 
       "source":"CC2", 
       "target":"App2" 
      } 
      ] 
     } 
    ] 

J'ai essayé d'utiliser une combinaison de filtre, carte et l'opérateur tartinable à ES6 mais pas encore trouvé la meilleure combinaison qui y parvenir. La sortie que je veux est ci-dessous:

[ 
      { 
       "connector":[ 
       { 
        "name":"CC1" 
       }, 
       { 
        "name":"App1" 
       }, 
       { 
        "name":"App2" 
       }, 
       { 
        "name":"App3" 
       } 
       ], 
       "connections":[ 
       { 
        "source":"CC1", 
        "target":"App1" 
       }, 
       { 
        "source":"CC1", 
        "target":"App2" 
       }, 
       { 
        "source":"CC1", 
        "target":"App3" 
       } 
       ] 
      }, 
      { 
       "connector":[ 
       { 
        "name":"CC1" 
       }, 
       { 
        "name":"App1" 
       }, 
       { 
        "name":"App2" 
       }, 
       { 
        "name":"App3" 
       } 
       ], 
       "connections":[ 
       { 
        "source":"CC1", 
        "target":"App1" 
       }, 
       { 
        "source":"CC1", 
        "target":"App2" 
       }, 
       { 
        "source":"CC1", 
        "target":"App3" 
       } 
       ] 
      }, 
      { 
       "connector":[ 
       { 
        "name":"CC1" 
       }, 
       { 
        "name":"App1" 
       }, 
       { 
        "name":"App2" 
       }, 
       { 
        "name":"App3" 
       } 
       ], 
       "connections":[ 
       { 
        "source":"CC1", 
        "target":"App1" 
       }, 
       { 
        "source":"CC1", 
        "target":"App2" 
       }, 
       { 
        "source":"CC1", 
        "target":"App3" 
       } 
       ] 
      }, 
      { 
       "connector":[ 
       { 
        "name":"CC2" 
       }, 
       { 
        "name":"App2" 
       } 
       ], 
       "connections":[ 
       { 
        "source":"CC2", 
        "target":"App2" 
       } 
       ] 
      } 
     ] 

Quelle serait la solution la plus optimale pour y parvenir? Merci d'avance pour l'aide ..

+0

Juste en-cas si vous prévoyez d'utiliser lodash. C'est comme ça que vous pouvez faire ça. '_.map (données, (i) => { i.connector = _.uniqBy (i.connector, 'nom'); return i; })' –

+0

La meilleure façon de le faire , serait d'arrêter les données redondantes avant même d'aller dans ce tableau d'objets. – PHPglue

Répondre

1

setTimeout(doit, 100); 
 

 
function doit() { 
 
    data.forEach(obj => { 
 
    obj.connector = obj.connector.filter(({name}, i, arr) => 
 
     arr.findIndex(o => o.name === name) === i 
 
    ) 
 
    }); 
 

 
    console.log(data); 
 
} 
 

 
var data = [{ 
 
    "connector": [{ 
 
     "name": "CC1" 
 
     }, 
 
     { 
 
     "name": "App1" 
 
     }, 
 
     { 
 
     "name": "CC1" 
 
     }, 
 
     { 
 
     "name": "App2" 
 
     }, 
 
     { 
 
     "name": "CC1" 
 
     }, 
 
     { 
 
     "name": "App3" 
 
     } 
 
    ], 
 
    "connections": [{ 
 
     "source": "CC1", 
 
     "target": "App1" 
 
     }, 
 
     { 
 
     "source": "CC1", 
 
     "target": "App2" 
 
     }, 
 
     { 
 
     "source": "CC1", 
 
     "target": "App3" 
 
     } 
 
    ] 
 
    }, 
 
    { 
 
    "connector": [{ 
 
     "name": "CC1" 
 
     }, 
 
     { 
 
     "name": "App1" 
 
     }, 
 
     { 
 
     "name": "CC1" 
 
     }, 
 
     { 
 
     "name": "App2" 
 
     }, 
 
     { 
 
     "name": "CC1" 
 
     }, 
 
     { 
 
     "name": "App3" 
 
     } 
 
    ], 
 
    "connections": [{ 
 
     "source": "CC1", 
 
     "target": "App1" 
 
     }, 
 
     { 
 
     "source": "CC1", 
 
     "target": "App2" 
 
     }, 
 
     { 
 
     "source": "CC1", 
 
     "target": "App3" 
 
     } 
 
    ] 
 
    }, 
 
    { 
 
    "connector": [{ 
 
     "name": "CC1" 
 
     }, 
 
     { 
 
     "name": "App1" 
 
     }, 
 
     { 
 
     "name": "CC1" 
 
     }, 
 
     { 
 
     "name": "App2" 
 
     }, 
 
     { 
 
     "name": "CC1" 
 
     }, 
 
     { 
 
     "name": "App3" 
 
     } 
 
    ], 
 
    "connections": [{ 
 
     "source": "CC1", 
 
     "target": "App1" 
 
     }, 
 
     { 
 
     "source": "CC1", 
 
     "target": "App2" 
 
     }, 
 
     { 
 
     "source": "CC1", 
 
     "target": "App3" 
 
     } 
 
    ] 
 
    }, 
 
    { 
 
    "connector": [{ 
 
     "name": "CC2" 
 
     }, 
 
     { 
 
     "name": "App2" 
 
     } 
 
    ], 
 
    "connections": [{ 
 
     "source": "CC2", 
 
     "target": "App2" 
 
    }] 
 
    } 
 
];

1

Si vous allez juste besoin d'opérations communes comme carte, filtre, trouver et chacun vous n'avez pas besoin lodash:

const data = [{connector:[{name:"CC1"},{name:"App1"},{name:"CC1"},{name:"App2"},{name:"CC1"},{name:"App3"}],connections:[{source:"CC1",target:"App1"},{source:"CC1",target:"App2"},{source:"CC1",target:"App3"}]},{connector:[{name:"CC1"},{name:"App1"},{name:"CC1"},{name:"App2"},{name:"CC1"},{name:"App3"}],connections:[{source:"CC1",target:"App1"},{source:"CC1",target:"App2"},{source:"CC1",target:"App3"}]},{connector:[{name:"CC1"},{name:"App1"},{name:"CC1"},{name:"App2"},{name:"CC1"},{name:"App3"}],connections:[{source:"CC1",target:"App1"},{source:"CC1",target:"App2"},{source:"CC1",target:"App3"}]},{connector:[{name:"CC2"},{name:"App2"}],connections:[{source:"CC2",target:"App2"}]}]; 
 

 
const result = data.map(e => ({ ...e, connector: 
 
    e.connector 
 
    // Filter the original connector array 
 
    // and return only those elements which name is 
 
    // the same as a connection source or target 
 
    .filter(c => e.connections.find(cn => [cn.source, cn.target].indexOf(c.name) !== -1)) 
 
     // Remove duplicates by name as @llama notes 
 
    .filter((v, i, ary) => ary.findIndex(c => c.name === v.name) === i) 
 
})); 
 

 
console.log(result)

+0

Vous avez supprimé manuellement les doublons de l'entrée 'data'. Si vous les remettez, vous verrez que votre fichier '.filter()' ne les supprime pas. – llama

+0

Je pense que ce que vous voulez dire, c'est que mon code ne modifie pas la variable 'data' d'origine à droite? C'est prévu. – nicooga

+0

Non, je dis que votre exemple modifie les données d'origine affichées dans la question de sorte que les doublons à supprimer ne sont plus là. Remettez-les en place et vous verrez que votre solution ne les supprimera pas. C'est parce que votre call '.find()' retournera 'true' pour toutes les entrées dupliquées. – llama

-1

Cela va filtrer tous les objets qui se répètent, connectors et connections objets peuvent avoir un nombre quelconque de clés.

mapper = (input) => 
     input.map(x => JSON.stringify(x))   // Stringify 
     .filter((x, i, a) => a.indexOf(x) === i) // Filter out repeating elements 
     .map(x => JSON.parse(x))     // Parse stringified object 


output = input.map(item => 
      ({ 
       connector: mapper(item.connector), 
       connections: mapper(item.connections) 
      }) 
     )