0

我有以下对象数组。我需要做的只是从所有连接器阵列中删除匹配的键值对。从对象数组中删除重复的元素 - 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" 
       } 
       ] 
      } 
     ] 

什么是最优化的解决方案来实现这一目标?在此先感谢您的帮助..

+0

只要你打算使用lodash。这是你如何做到的。 (i.connector = _.uniqBy(i.connector,'name'); return i; })' –

+0

这是最好的,最理想的方式来做到这一点,将会在冗余数据进入这个对象数组之前停止。 – PHPglue

回答

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

如果你只是要需要像地图,过滤器常用的操作,发现每一次你不需要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

您手动删除输入“数据”中的重复项。如果你把它们放回去,你会看到你的'.filter()'不会删除它们。 – llama

+0

我想你的意思是说我的代码不会改变原来的'data'变量吧?这是打算。 – nicooga

+0

不,我要说的是,您的示例会更改发布在问题中的原始数据,以便重复删除的内容不再存在。把它们放回去,你会发现你的解决方案不会删除它们。这是因为你的'.find()'回调函数将为所有重复条目返回“true”。 – llama

-1

这将筛选出在重复的任何对象,connectorsconnections对象可以有任意数量的键。

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) 
      }) 
     )