2017-03-28 4 views
0

this関数をangular2/Typescriptに変換しようとしています。オブジェクトの配列を複数のフィールドで並べ替えるためです。angular2複数のフィールドでオブジェクトの配列を並べ替える関数

私はTypescriptを初めて使用しています。その点をきれいにチェックできますか?

私は

prodataTemp.sort(this.UtilsService.sort_by('brand', 'name', 'model')); 

とutilsの-service.ts中を呼び出しています:

sort_by(...args: any[]) { //multiple sort https://stackoverflow.com/questions/6913512/how-to-sort-an-array-of-objects-by-multiple-fields 
     var fields = [], 
      n_fields = args.length, 
      field, name, reverse, cmp; 

     var default_cmp = function(a, b) { 
      if (a == b) return 0; 
      return a < b ? -1 : 1; 
     }; 

     var getCmpFunc = function(primer, reverse) { 
      var dfc = default_cmp, // closer in scope 
       cmp = default_cmp; 
      if (primer) { 
       cmp = function(a, b) { 
        return dfc(primer(a), primer(b)); 
       }; 
      } 
      if (reverse) { 
       return function(a, b) { 
        return -1 * cmp(a, b); 
       }; 
      } 
      return cmp; 
     }; 

     // preprocess sorting options 
     for (var i = 0; i < n_fields; i++) { 
      field = args[i]; 
      if (typeof field === 'string') { 
       name = field; 
       cmp = default_cmp; 
      } 
      else { 
       name = field.name; 
       cmp = getCmpFunc(field.primer, field.reverse); 
      } 
      fields.push({ 
       name: name, 
       cmp: cmp 
      }); 
     } 

     // final comparison function 
     return function(A, B) { 
      var a, b, name, result; 
      for (var i = 0; i < n_fields; i++) { 
       result = 0; 
       field = fields[i]; 
       name = field.name; 

       result = field.cmp(A[name], B[name]); 
       if (result !== 0) break; 
      } 
      return result; 
     } 
    }; 

感謝を!

+1

問題がありますか? –

+0

番号。たぶん、関数を詳細にテストする必要があるかもしれませんが、今のところエラーはありません。 – Louis

+0

ここで具体的な質問をしなければなりません。スコープの変数をリセットするのではなく、関数を入れ子にするために矢印関数を使うことをお勧めします。 –

答えて

-1
function sortByMutipleFields(...args: string[]) { 
    // takes a list of arguments representing sort fields 
    // if preceded by a ! then reverse order (!lastName for example) 
    // returns a function that works in Array.sort() 
    return (a: any, b: any): number => { 
    for (var index = 0; index < args.length; index++) { 
     let fieldLeft: string; 
     let fieldRight: string; 
     if (args[index].startsWith('!')) { 
     fieldLeft = b[args[index].slice(1)]; 
     fieldRight = a[args[index].slice(1)]; 
     } else { 
     fieldLeft = a[args[index]]; 
     fieldRight = b[args[index]]; 
     } 
     if (fieldLeft > fieldRight) { return 1 }; 
     if (fieldLeft < fieldRight) { return -1 }; 
    }; 
    return 0; 
    } 
} 

このようにすればどうでしょうか?

+0

単なるコードブロックではなく、いくつかの説明を提供する必要があります。 –

+0

彼はTypescriptにJavaScriptを要求していません。私も同じようにしたい。私はオブジェクトのリストを持っています。 IDで並べ替え、次に都市で並べ替えたい – Ziggler

関連する問題