3

問題

私は実際にGoogleシートに入力されたデータである2次元配列を持っています。ユーザーによって定義されたロジックによってソートされます。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. 以下のコード、:そこより良いアプローチがありますこのコードをシートで使用し、limits on script timeというコードを使用するためです。
  • +1

    @Luca、私は質問を編集し、適切な答えを識別することを制限されてきました。再開してください。私は正しい答えを持っていて、私の質問が他のユーザーに役立つことを願っています –

    答えて

    3

    sorting with mapを使用できます。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

    ユーザーが以前に入力したため、「ヨーロッパ」は「アメリカ」の前に表示されます。 –