我有一个二维数组,实际上是输入Google表格的数据。它按逻辑排序,由用户定义。
目标是在此表的末尾输入新行,然后按位置对其进行排序。
按位置说""我的意思是"欧洲"走在"美国"因为用户已经提前输入了它。
以下是测试的示例数组:
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']
];
正确的结果数组是:
/*
[ [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]
]
*/
我想为此使用脚本。
我已经制作了自己的脚本版本,请看这里:
https://github.com/Max-Makhrov/positional-sorting/blob/master/main.js
该算法从第一行开始查找组:地球>欧洲>英国。然后它尝试在以后的条目中找到这些组的匹配项。
我还考虑过为较早的条目分配更高的索引。
问题:是否有更好的方法:
答案 0 :(得分:4)
您可以使用sorting with map,其中每个组都会获得第一个找到的用于对组进行排序的索引。
稍后取最后一项用于映射数组。
它适用于组的嵌套哈希表,例如
{ 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 } } } } }
其中每个属性_
表示该组的第一个索引。
用于排序的临时数组如下所示,
// 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 ] // --------+ ]
这用于对临时数组进行排序。
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']],
hash = Object.create(null),
result = data
.map(function (a, i) {
var temp = hash;
return a.map(function (k) {
temp[k] = temp[k] || { _: i };
temp = temp[k];
return temp._;
});
})
.sort(function (a, b) {
var value;
a.some(function (v, i) {
return value = v - b[i];
});
return value;
})
.map(function (indices) {
return data[indices[indices.length - 1]];
});
console.log(result.map(function (a) { return a.join(', '); }));

.as-console-wrapper { max-height: 100% !important; top: 0; }