Max*_*rov 3 javascript sorting grouping google-sheets google-apps-script
我有一个二维数组,它实际上是输入到 Google Sheet 中的数据。它按逻辑排序,由用户定义。
目标是在此表的末尾输入新行,然后按位置对其进行排序。

说“按位置”我的意思是“欧洲”在“美国”之前,因为用户已经输入了它。
这是用于测试的示例数组:
var data =
[
['Earth', 'Europe', 'Britain', 'London'],
['Earth', 'Europe', 'Britain', 'Manchester'],
['Earth', 'Europe', 'Britain', 'Liverpool'],
['Earth', 'Europe', 'France', 'Paris'],
['Earth', 'Europe', 'France', 'Lion'],
['Earth', 'Europe', 'Italy', 'Rome'],
['Earth', 'Europe', 'Italy', 'Milan'],
['Earth', 'Europe', 'Greece', 'Athenes'],
['Earth', 'Asia', 'China', 'Pekin'],
['Earth', 'Africa', 'Algeria', 'Algiers'],
['Earth', 'America', 'USA', 'Dallas'],
['Earth', 'America', 'USA', 'New York'],
['Earth', 'America', 'USA', 'Chicago'],
['Tatooine', 'Yulab', 'Putesh', 'ASU'],
['Tatooine', 'Yulab', 'Putesh', 'Niatirb'],
['Tatooine', 'Yulab', 'Zalip', 'Duantan'],
['Tatooine', 'Asia', 'Solo', 'Lion'],
['Tatooine', 'Asia', 'Solo', 'To'],
['Earth', 'America', 'USA', 'San Francisco'],
['Tatooine', 'Yulab', 'Koko', 'Traiwau'],
['Venus', 'Yoo', 'Van', 'Derzar'],
['Tatooine', 'Chendoo', 'org', 'Eccel']
];
Run Code Online (Sandbox Code Playgroud)
正确的结果数组是:
/*
[ [Earth, Europe, Britain, London],
[Earth, Europe, Britain, Manchester],
[Earth, Europe, Britain, Liverpool],
[Earth, Europe, France, Paris],
[Earth, Europe, France, Lion],
[Earth, Europe, Italy, Rome],
[Earth, Europe, Italy, Milan],
[Earth, Europe, Greece, Athenes],
[Earth, Asia, China, Pekin],
[Earth, Africa, Algeria, Algiers],
[Earth, America, USA, Dallas],
[Earth, America, USA, New York],
[Earth, America, USA, Chicago],
[Earth, America, USA, San Francisco],
[Tatooine, Yulab, Putesh, ASU],
[Tatooine, Yulab, Putesh, Niatirb],
[Tatooine, Yulab, Zalip, Duantan],
[Tatooine, Yulab, Koko, Traiwau],
[Tatooine, Asia, Solo, Lion],
[Tatooine, Asia, Solo, To],
[Tatooine, Chendoo, org, Eccel],
[Venus, Yoo, Van, Derzar]
]
*/
Run Code Online (Sandbox Code Playgroud)
我想为此使用脚本。
我已经制作了自己的脚本版本,请参见此处:
https://github.com/Max-Makhrov/positional-sorting/blob/master/main.js
该算法从第一行开始查找组:地球 > 欧洲 > 英国。然后它会尝试在以后的条目中找到该组的匹配项。
我还考虑为较早的条目分配更高的索引。
问题:是否有更好的方法:
您可以将排序与 map 结合使用,其中每个组都会获取第一个找到的索引来对组进行排序。
稍后取最后一项映射回数组。
它与组的嵌套哈希表一起使用,例如
Run Code Online (Sandbox Code Playgroud){ Earth: { _: 0, Europe: { _: 0, Britain: { _: 0, London: { _: 0 }, Manchester: { _: 1 }, Liverpool: { _: 2 } }, // ... }, // ... America: { _: 10, USA: { _: 10, Dallas: { _: 10 }, "New York": { _: 11 }, Chicago: { _: 12 }, "San Francisco": { _: 18 } } } } }
其中每个属性_表示组的第一个索引。
用于排序的临时数组如下所示,
Run Code Online (Sandbox Code Playgroud)// index of group // index of group // index of group // own index [ [ 0, 0, 0, 0 ], [ 0, 0, 0, 1 ], [ 0, 0, 0, 2 ], [ 0, 0, 3, 3 ], [ 0, 0, 3, 4 ], [ 0, 0, 5, 5 ], [ 0, 0, 5, 6 ], [ 0, 0, 7, 7 ], [ 0, 8, 8, 8 ], [ 0, 9, 9, 9 ], [ 0, 10, 10, 10 ], [ 0, 10, 10, 11 ], [ 0, 10, 10, 12 ], // /_ moving between [ 13, 13, 13, 13 ], // \ | both items [ 13, 13, 13, 14 ], // | [ 13, 13, 15, 15 ], // |/_ [ 13, 16, 16, 16 ], // |\ | [ 13, 16, 16, 17 ], // | |/_ [ 0, 10, 10, 18 ], // --+ |\ | [ 13, 13, 19, 19 ], // -----+ | [ 20, 20, 20, 20 ], // | [ 13, 21, 21, 21 ] // --------+ ]
这是为了对临时数组进行排序。
{
Earth: {
_: 0,
Europe: {
_: 0,
Britain: {
_: 0,
London: {
_: 0
},
Manchester: {
_: 1
},
Liverpool: {
_: 2
}
},
// ...
},
// ...
America: {
_: 10,
USA: {
_: 10,
Dallas: {
_: 10
},
"New York": {
_: 11
},
Chicago: {
_: 12
},
"San Francisco": {
_: 18
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
// index of group
// index of group
// index of group
// own index
[
[ 0, 0, 0, 0 ],
[ 0, 0, 0, 1 ],
[ 0, 0, 0, 2 ],
[ 0, 0, 3, 3 ],
[ 0, 0, 3, 4 ],
[ 0, 0, 5, 5 ],
[ 0, 0, 5, 6 ],
[ 0, 0, 7, 7 ],
[ 0, 8, 8, 8 ],
[ 0, 9, 9, 9 ],
[ 0, 10, 10, 10 ],
[ 0, 10, 10, 11 ],
[ 0, 10, 10, 12 ], // /_ moving between
[ 13, 13, 13, 13 ], // \ | both items
[ 13, 13, 13, 14 ], // |
[ 13, 13, 15, 15 ], // |/_
[ 13, 16, 16, 16 ], // |\ |
[ 13, 16, 16, 17 ], // | |/_
[ 0, 10, 10, 18 ], // --+ |\ |
[ 13, 13, 19, 19 ], // -----+ |
[ 20, 20, 20, 20 ], // |
[ 13, 21, 21, 21 ] // --------+
]
Run Code Online (Sandbox Code Playgroud)