3

問題

我有一個2d數組,它實際上是輸入到Google Sheet中的數據。它按用戶定義的邏輯進行排序。位置排序的2d數組

目標是在此表末尾輸入新行,然後按位置對其進行排序。

enter image description here

說「的位置」我的意思是「歐洲」變「美」之前,因爲用戶已經較早進入它。

下面是測試樣品陣列:

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

算法如何工作

算法找到組從第一次開始排:地球>歐洲>英國。然後它會嘗試在稍後的條目中爲這些組找到一個匹配項。

我也想過將更高的索引分配給更早的條目。

問題

的問題:是否有更好的方法:

  1. 更少的代碼來完成相同的任務
  2. 更普遍的方式來排序位置的陣列
  3. 需要足夠快的解決方案,因爲我將使用表單中的代碼,並且它有limits on script time
+1

@Luca,我編輯的問題,限制它,以確定適當的答案。你能重新打開它嗎?我已經得到了正確的答案,並希望我的問題對其他用戶有所幫助 –

回答

3

您可以使用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; }

+0

謝謝!這段代碼很漂亮,但它給了我一個字母順序,而不是位置。 –

+0

這種情況下的位置是什麼意思? –

+0

這意味着「歐洲」在「美國」之前,因爲用戶之前輸入了它。 –