首页 > 解决方案 > 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);
  } 
 });
}

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

标签: javascriptarraysd3.js

解决方案


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

该解决方案采用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; }


推荐阅读