удалить повторяющиеся элементы из массива объектов - 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"
             }
          ]
       }
    ]

Я пытался использовать комбинацию фильтра, карты и расширяемого оператора в es6, но еще не нашел наилучшей комбинации, которая позволила бы добиться этого. Результат, который я хотел бы, приведен ниже:

 [  
           {  
              "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"
                 }
              ]
           }
        ]

Что было бы наиболее оптимальным решением для достижения этой цели? Заранее спасибо за помощь..


person pj013    schedule 17.10.2017    source источник
comment
На всякий случай, если вы планируете использовать lodash. Вот как вы можете это сделать. _.map(data, (i) => { i.connector = _.uniqBy(i.connector, 'name'); return i; })   -  person user-developer    schedule 18.10.2017
comment
Лучшим, наиболее оптимальным способом сделать это было бы остановить избыточные данные еще до того, как они попадут в этот массив объектов.   -  person StackSlave    schedule 18.10.2017


Ответы (2)


Если вам просто понадобятся общие операции, такие как карта, фильтрация, поиск и все, что вам не нужно, 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)

person nicooga    schedule 17.10.2017
comment
Вы вручную удалили дубликаты из ввода data. Если вы вставите их обратно, вы увидите, что ваш .filter() не удаляет их. - person llama; 18.10.2017
comment
Я думаю, вы имеете в виду, что мой код не изменяет исходную переменную data, верно? Это предназначено. - person nicooga; 18.10.2017
comment
Нет, я говорю, что ваш пример изменяет исходные данные, опубликованные в вопросе, так что дубликатов, которые нужно удалить, больше нет. Вставьте их обратно, и вы увидите, что ваше решение не удалит их. Это связано с тем, что ваш обратный вызов .find() будет возвращать true для всех повторяющихся записей. - person llama; 19.10.2017
comment
... похоже, вы скопировали желаемые выходные данные вместо фактических данных. Вот что я имею в виду: jsfiddle.net/v4p8wsbo Ни один из повторяющихся объектов не удаляется. - person llama; 19.10.2017

Это отфильтрует любые повторяющиеся объекты, объекты connectors и connections могут иметь любое количество ключей.

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) 
            })
          )
person Nandu Kalidindi    schedule 18.10.2017