Javascript 通过匹配开始和结束节点对项目进行排序
假设我有一组随机洗牌的棋子,属于不同的组。例如:Javascript 通过匹配开始和结束节点对项目进行排序,javascript,sorting,Javascript,Sorting,假设我有一组随机洗牌的棋子,属于不同的组。例如: let pieces = [ { id: "a1", startNode: 18, endNode: 42, }, { id: "a3", startNode: 16, endNode: 30, }, { id: "b2", startNode: 48, endNode: 65, }, { id: "a2", startNode:
let pieces = [
{
id: "a1",
startNode: 18,
endNode: 42,
},
{
id: "a3",
startNode: 16,
endNode: 30,
},
{
id: "b2",
startNode: 48,
endNode: 65,
},
{
id: "a2",
startNode: 42,
endNode: 16,
},
{
id: "a4",
startNode: 30,
endNode: 31,
},
{
id: "b1",
startNode: 23,
endNode: 48,
},
];
我希望它们以正确的顺序作为两个数组返回:
ordered = [
[
{
id: "a1",
startNode: 18,
endNode: 42,
},
{
id: "a2",
startNode: 42,
endNode: 16,
},
{
id: "a3",
startNode: 16,
endNode: 30,
},
{
id: "a4",
startNode: 30,
endNode: 31,
},
],[
{
id: "b1",
startNode: 23,
endNode: 48,
},
{
id: "b2",
startNode: 48,
endNode: 65,
},
]
];
它们按匹配的开始节点和结束节点排序,因此“a2”在“a1”之后,因为其开始节点与“a1”的结束节点匹配。“b1”和“b2”属于不同的组,因为它们不与任何“a”组共享开始节点或结束节点。id不能用于排序,只是为了清楚起见
有什么办法吗?我认为它需要某种递归函数,我不能完全理解它。尝试使用simple=>a.id>b.id
let parties=[{id:“a1”,起始节点:18,结束节点:42,},{id:“a3”,起始节点:16,结束节点:30,},{id:“b2”,起始节点:48,结束节点:65,},{id:“a2”,起始节点:42,结束节点:16,},{id:“a4”,起始节点:30,结束节点:31,},{id:“b1”,起始节点:23,结束节点:48,};
console.log(pieces.sort((a,b)=>a.id>b.id))
在迭代子结果的同时,还可以针对实际(外部)元素使用迭代方法
此单个元素在一个数组中收集所有匹配的开始节点和结束节点,而其他不匹配的节点将被过滤,稍后收集数组将合并
var片段=[{id:“a1”,起始节点:18,结束节点:42},{id:“a3”,起始节点:16,结束节点:30},{id:“b2”,起始节点:48,结束节点:65},{id:“a2”,起始节点:42,结束节点:16},{id:“a4”,起始节点:30,结束节点:31},{id:“b1”,起始节点:23,结束节点:48},
结果=个数。减少(函数(r,a){
var temp=[a];
返回r.过滤器(功能(b){
if(temp[temp.length-1].endNode==b[0].startNode){
温度=温度混凝土(b);
返回;
}
if(temp[0].startNode==b[b.length-1].endNode){
温度=b.concat(温度);
返回;
}
返回true;
}).concat([temp]);
}, []);
控制台日志(结果)代码>
.as console wrapper{max height:100%!important;top:0;}
即使这对测试用例有效,我认为排序应该是startNode==previous endNodeSorry,但id和节点值实际上是一些任意的9位数字序列。为了便于阅读,我在这里修改了它们。它们不能用于排序,只能用于节点值。哇,尼娜,这真的很管用。我也尝试过用更多的数据,效果很好。现在我需要非常仔细地看一下你在那里用过滤函数做了什么。谢谢你。