JS过滤器数组,但如果存在反向则不过滤

时间:2019-03-01 19:01:16

标签: javascript arrays d3.js

我在每个节点上使用node.path(target),以d3js树形图的形式出现了一个数组

var arr = [[{data: A},{data: B},{data: C}],
           [{data: C},{data: B},{data: A}],
           [{data: B},{data: D},{data: A}],
           [{data: A},{data: D},{data: B}]
          ]

我想过滤数组以删除反向路径,即[{data: C},{data: B},{data: A}][{data: A},{data: B},{data: C}]的反向路径,因此仅应保留[{data: A},{data: B},{data: C}]

最终数组应如下所示:

var finalarr = [[{data: A},{data: B},{data: C}],
                [{data: B},{data: D},{data: A}],
               ]

我尝试做一个简单的反向比较。

function removereversepaths(arr){
 var cleanpaths = [];

 arr.forEach((a) => {
  var arev = [...a].reverse();
  if (!cleanpaths.includes(arev)){
   cleanpaths.push(a);
  } 
 });
}

我想知道是否可以编写一个过滤器函数来执行此操作,但是由于某种原因,我在如何检查反向数组的过滤器函数中的新数组上画了一个空白。 任何帮助/方向表示赞赏。预先感谢。

1 个答案:

答案 0 :(得分:3)

您可以使用过滤后的数组作为结果并进行查找。

此解决方案采用data属性进行比较,如果数组的顺序相反,则此数组将被滤除。

要检查filtered数组中是否已存在该数组,请对该数组进行迭代并检查从最后一个元素到第一个元素的每个元素,如果发现一个带有相同值的对象的数组,则提早退出。

const compare = (a, b) => a.data === b.data; // or what ever suits

var array = [[{ data: 'A' }, { data: 'B' }, { data: 'C' }], [{ data: 'C' }, { data: 'B' }, { data: 'A' }], [{ data: 'B' }, { data: 'D' }, { data: 'A' }], [{ data: 'A' }, { data: 'D' }, { data: 'B' }]],
    filtered = [];

array.filter(a => {
    if (filtered.some(t => a.every((o, i, { length }) => compare(t[length - 1 - i], o)))) {
        return;
    }
    filtered.push(a);
});

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