【问题标题】:JS filter array but do not filter if reverse presentJS过滤数组,但如果反向存在则不过滤
【发布时间】:2019-03-01 19:01:15
【问题描述】:

我有一个来自 d3js 树形图的数组,在每个节点上使用 node.path(target)

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

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

【问题讨论】:

  • 对象中是否只有一个属性?
  • 你能展示一个真实或混淆数据的例子吗? {data: X} 的结构应该有助于我们提供答案。
  • @Barthy 的数据实际上就像 [{data: A, value: '123'},{data: B, value: '213'},{data: C, value: '530'}] 例如。我简化了它,因为我只需要按data 字段进行过滤。

标签: javascript arrays d3.js


【解决方案1】:

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

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

【讨论】:

  • 感谢您的解决方案。您能否为我的理解添加更详细的代码说明。
猜你喜欢
  • 2021-09-10
  • 2020-05-14
  • 1970-01-01
  • 1970-01-01
  • 2018-04-26
  • 2022-12-07
  • 1970-01-01
  • 1970-01-01
  • 2021-06-30
相关资源
最近更新 更多