Eliminar bordes duplicados de una matriz para un gráfico dirigido de fuerza d3

Tengo una serie de bordes para un gráfico de fuerza dirigida, que se ve así pero mucho más largo.

var rawLinks = [{ source: 1, target: 2 }, { source: 2, target: 1 }, { source: 6, target: 7 }, { source: 7, target: 6 }, { source: 8, target: 9 }, { source: 8, target: 9 }, { source: 8, target: 86 }, { source: 8, target: 101 }, { source: 8, target: 133 }, { source: 8, target: 134 }] 

Como estos son puntos en una superficie para que siga una línea, quiero eliminar los elementos que resultarán en líneas duplicadas entre los puntos.

Por ejemplo, solo quiero uno de los dos primeros elementos, ya que darían como resultado una línea de 1 a 2 y de 2 a 1. Solo necesito una línea entre 1 y 2.

He intentado esto, pero tengo resultados inesperados.

 var links = []; for (var i=0; i<rawLinks.length; i++) { for (var j=0; j<rawLinks.length; j++) { if(rawLinks[i].source != rawLinks[j].target && rawLinks[i].target != rawLinks[j].source){ links.push(rawLinks[i]) } } } 

Estoy bastante seguro de que mi si la statement es el problema. ¿O es este el enfoque completamente equivocado?

Como de costumbre, estoy seguro de que es obvio para alguien con ojos nuevos. ¿Qué pasa con mi código?

Ya que no importa quién es el origen y quién es el objective (“1 a 2” es el mismo de “2 a 1” en su problema), primero reorganizaremos la matriz:

 rawLinks.forEach(function(d){ var sourceTemp = d.source, targetTemp = d.target; if(d.source > d.target){ d.source = targetTemp; d.target = sourceTemp; } }); 

Eso crea duplicados, como este:

 { source: 1, target: 2 } { source: 1, target: 2 } 

Luego, eliminamos los duplicados:

 function removeDups(myArray){ myArray.sort(); for(var i = 1; i < myArray.length; ){ if(myArray[i-1].source === myArray[i].source && myArray[i-1].target === myArray[i].target){ myArray.splice(i, 1); } else { i++; } } return myArray; } 

Aquí hay una demostración:

 var rawLinks = [{ source: 1, target: 2 }, { source: 2, target: 1 }, { source: 6, target: 7 }, { source: 7, target: 6 }, { source: 8, target: 9 }, { source: 8, target: 9 }, { source: 8, target: 86 }, { source: 8, target: 101 }, { source: 8, target: 133 }, { source: 8, target: 134 }]; rawLinks.forEach(function(d){ var sourceTemp = d.source; targetTemp = d.target; if(d.source > d.target){ d.source = targetTemp; d.target = sourceTemp; } }); function removeDups(myArray){ myArray.sort(); for(var i = 1; i < myArray.length; ){ if(myArray[i-1].source === myArray[i].source && myArray[i-1].target === myArray[i].target){ myArray.splice(i, 1); } else { i++; } } return myArray; } removeDups(rawLinks); console.log(rawLinks);