javascript - 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);
}
});
}
我想知道是否可以编写一个过滤器函数来执行此操作,但由于某种原因,我在如何检查过滤器函数中的新数组以获取反向数组时画了一个空白。任何帮助/方向表示赞赏。提前致谢。
解决方案
您可以使用过滤后的数组作为结果和查找。
该解决方案采用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; }
推荐阅读
- java - 我不能使用 jai-imageio / jai-imageio-jpeg2000
- ios - 在 iPhone 11 上,使用自定义视图,为什么我的 Tap Recognizer 或 UIButton 在视图的顶部没有响应但在视图的下部有效
- git - 如何使用 github 操作将代码推送到另一个用户的存储库
- angular - 是什么阻止我的表单在输入键时提交?
- c# - 发布后找不到 MVC 资源
- ios - 关闭一个 View Controller 并以相同的方法呈现一个新的 - swift
- node.js - 使用 bodyparser、Node.js 和 sqlite3 将站点上的表单中的数据插入数据库的问题
- sql-server - 在来自 SSIS dtsx 包的 SQL Server 数据库连接字符串中使用 3306 端口的问题
- excel - 如何解决以下 WIN - MAC vba 兼容性问题?
- python - 使用 paramiko SSH 到具有超级用户的设备