我猜...如果我理解正确的话,您是想进行依赖关系排序。那么我认为实现此任务的一种可能方法如下。这是我能想到的一种方式,但可能还有更简单的解决方案。
我们必须将彼此依赖的连续项分组(例如
[6]
、
[5,6]
和
[4,7,5,6]
),然后按其依赖关系对它们进行排序。我想,在不同组之间进行排序并不必要,因为它们的项目之间没有相关性(即
[1,2]
可以在经过排序的
[6]
、
[5,6]
和
[4,7,5,6]
组之前或之后出现)。
var paths = [
[5,6],
[1,2],
[4,7,5,6],
[6]
],
lut = paths.reduce((table,path,i) => (path.forEach(n => table[n] = table[n] ? table[n].concat([[i,path.length]])
.sort((a,b) => a[1]-b[1])
: [[i,path.length]]),
table),{}),
sorted = Object.keys(lut).sort((a,b) => lut[b].length - lut[a].length)
.reduce((si,k) => (lut[k].forEach(e => !si.includes(e[0]) && si.push(e[0])),si) ,[])
.map(idx => paths[idx]);
console.log(sorted);
好的,首先我们要从一个类似于查找表的对象(lut
)开始,而在这种情况下,它的形式如下:
{ '1': [ [ 1, 2 ] ],
'2': [ [ 1, 2 ] ],
'4': [ [ 2, 4 ] ],
'5': [ [ 0, 2 ], [ 2, 4 ] ],
'6': [ [ 3, 1 ], [ 0, 2 ], [ 2, 4 ] ],
'7': [ [ 2, 4 ] ]
}
所以我们现在知道路径6有最多的依赖项。
'6': [ [ 3, 1 ], [ 0, 2 ], [ 2, 4 ] ]
表示在
paths[3]
处它是独立的;在
paths[0]
处它有一个依赖项,在
paths[2]
处它有3个依赖项。因此,我们按照依赖项数量进行排序(
.sort((a,b) => a[1]-b[1])
)。
一旦我们有了表格,就只需要将它们排列起来,以获得所需的索引映射。
.reduce((si,k) => (lut[k].forEach(e => !si.includes(e[0]) && si.push(e[0])),si) ,[])
这行代码有点有趣。它的作用是对于每个路径,如果它还没有被添加到数组中,就将其索引推入数组中。因此,我们从具有最多依赖项的路径(6)开始,将3、0和2推入数组。因此,当轮到5时,我们不会再次推送相同的索引。
arr.sort((a, b) => a.length - b.length))
可以通过长度对包含数组的数组进行排序 示例。这只是单层,但深入多层将是遍历所有内容并基本上排序任何遇到的数组的问题。 - VLAZ