2016-11-25 3 views
0

私は選択したキーのアルファベット順に並べ替えたいオブジェクトの配列を持っています。あなたは上から見るようJavaScriptはオブジェクト配列の順序を切り替える

var locationsOrdered = false; 

function dynamicSort(property) { 
    var sortOrder = 1; 
    if (locationsOrdered) { 
    if(property[0] === "-") { 
     sortOrder = -1; 
     property = property.substr(1); 
    } 
    locationsOrdered = false; 
    } else { 
    property = '-' + property; 
    locationsOrdered = true; 
    } 

    return function (a,b) { 
    var result = (a[property] < b[property]) ? -1 : (a[property] > b[property]) ? 1 : 0; 
    return result * sortOrder; 
    } 
} 


People.sort(dynamicSort('Surname')) 

var People = [ 
    {Name: "Name", Surname: "Surname"}, 
    {Name:"AAA", Surname:"ZZZ"}, 
    {Name: "Name", Surname: "AAA"} 
]; 

私は指定されたプロパティを取るdynamicSortと呼ばれる機能を持っていますが、私はそれがそのが有効化されている場合、フロントでそれを-を与えるために値を切り替えたいと思います。したがって、dynamicSort('Surname')を実行する場合、その関数は以前に使用されたことを覚えておいてSurnameの前に-を追加してください。

Essentialy以前に使用されていた注文を元に戻したいと思っています。

jsFiddle

+0

あなたがもし/他に使用しているブール変数をトグルしています。 ' - 'チェックが本当に必要ですか? – Taplar

+0

しかし '-Surname'プロパティはありません – Oriol

答えて

0

私は、クラスオブジェクトのソートの状態を保存することを好みます。私はこれを行う簡単な方法があると確信しています。しかし、これはうまくいく方法を提案してくれます。ここでは、jsfiddle

mysortは、動的ソートのインスタンスであり、ソート対象の各プロパティの現在の状態を保持します。

dynamicSort = (function(){ 
    function dynamicSort() { 
    this.properties = {}; 
    }; 
    dynamicSort.prototype.sort = function(property){ 
    if (typeof this.properties[property] == "undefined"){ 
     // set the initial state 
     this.properties[property] = 1; 
    } else { 
     // toggle the state 
     this.properties[property] *= -1; 
    } 
    var sortOrder = this.properties[property]; 

    return function (a,b) { 
     var result = (a[property] < b[property]) ? -1 : (a[property] > b[property]) ? 1 : 0; 
     return result * sortOrder; 
    } 
} 

    return dynamicSort; 
})(); 

var People = [ 
    {Name: "Name", Surname: "Surname"}, 
    {Name:"AAA", Surname:"ZZZ"}, 
    {Name: "Name", Surname: "AAA"} 
]; 
mysort = new dynamicSort(); 

People.sort(mysort.sort('Surname')) 
for (person of People){ 
    console.log(person.Name, person.Surname); 
} 
People.sort(mysort.sort('Surname')) 
for (person of People){ 
    console.log(person.Name, person.Surname); 
} 

初めてそれは姓でソートされ、それが昇順に出力意志:

名AAA

名姓

AAAのZZZ

2回目は姓でソートされ、降順で出力されます。

AAAのZZZ

名姓

名AAA

関連する問題