Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 通过匹配开始和结束节点对项目进行排序_Javascript_Sorting - Fatal编程技术网

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位数字序列。为了便于阅读,我在这里修改了它们。它们不能用于排序,只能用于节点值。哇,尼娜,这真的很管用。我也尝试过用更多的数据,效果很好。现在我需要非常仔细地看一下你在那里用过滤函数做了什么。谢谢你。