2015-04-24 104 views
4

排序陣列I具有以下結構:由密鑰對象

var participant0 = { 
    name : "", 
    nickname : "", 
    number "99999" 
} ; 

var participant1 = { 
    name : "bbb", 
    nickname : "", 
} ; 

var participant2 = { 
    name : "", 
    nickname : "aaa" 
} ; 

var participant3 = { 
    name : "ccc", 
    nickname : "" 
} ; 

,我已經含有結構的實例的數組:

var array = [participant0, participant3, participant1, participant2]; 

我想排序此陣列由字母。首先名稱,暱稱第二。如果這兩個鍵不存在,我想檢查數字鍵並將此元素放在排序列表的末尾。

預期結果:

var array = [participant2, participant1, participant3, participant0]; 

下面的代碼(由 「AAA」, 「BBB」, 「CCC」, 「9999」 已經整理對象)工作正常進行排序姓名或暱稱,但我不知道如何在排序列表的末尾提出的項目,如果有數字鍵:

fav_list.sort(function(x, y) { 
       return (x.participant.name || x.participant.nickname).localeCompare(y.participant.name || y.participant.nickname); 
      }); 
+0

爲什麼'participant2'的結果應該是前'participant1'?真的有'暱稱=「aaa」<暱稱=「」'? – hindmost

+1

比較「2」和「10」哪一個最先? –

+1

@最後'暱稱=「aaa」<名稱=「bbb」'。這些排序規則很奇怪嗎?是的,他們是,但這是OP想要的。 – Regent

回答

2

我想這應該這樣做,看到評論在代碼中:

fav_list.sort(function(x, y) { 
    var xvalue = x.participant.name || x.participant.nickname; 
    var yvalue = y.participant.name || y.participant.nickname; 
    // By name if both have names 
    if (xvalue && yvalue) { 
     return xvalue.localeCompare(yvalue); 
    } 
    // Names always come before numbers 
    if (xvalue) { 
     return -1; 
    } 
    if (yvalue) { 
     return 1 
    } 
    // Otherwise compare numbers 
    return (x.participant.number || 0) - (y.participant.number || 0); 
}); 

您可能想要使用最後一行中的默認數字(零)。

請注意,您顯示的數組與代碼不完全匹配,因爲數組直接使用參與者,但代碼期望參與者位於對象的participant屬性中。

略有調整陣列和一個方便的方式告訴我們最終什麼樣的順序了活生生的例子:

var participant0 = { 
 
    name: "", 
 
    nickname: "", 
 
    number: "99999", 
 
    debug: 0 
 
}; 
 

 
var participant1 = { 
 
    name: "bbb", 
 
    nickname: "", 
 
    debug: 1 
 
}; 
 

 
var participant2 = { 
 
    name: "", 
 
    nickname: "aaa", 
 
    debug: 2 
 
}; 
 

 
var participant3 = { 
 
    name: "ccc", 
 
    nickname: "", 
 
    debug: 3 
 
}; 
 

 
var array = [ 
 
    { 
 
    participant: participant0 
 
    }, 
 
    { 
 
    participant: participant3 
 
    }, 
 
    { 
 
    participant: participant1 
 
    }, 
 
    { 
 
    participant: participant2 
 
    } 
 
]; 
 

 
array.sort(function(x, y) { 
 
    var xvalue = x.participant.name || x.participant.nickname; 
 
    var yvalue = y.participant.name || y.participant.nickname; 
 
    // By name if both have names 
 
    if (xvalue && yvalue) { 
 
    return xvalue.localeCompare(yvalue); 
 
    } 
 
    // Names always come before numbers 
 
    if (xvalue) { 
 
    return -1; 
 
    } 
 
    if (yvalue) { 
 
    return 1 
 
    } 
 
    // Otherwise compare numbers 
 
    return (x.participant.number || 0) - (y.participant.number || 0); 
 
}); 
 
array.forEach(function(entry) { 
 
    snippet.log(entry.participant.debug); 
 
});
<!-- Script provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 --> 
 
<script src="http://tjcrowder.github.io/simple-snippets-console/snippet.js"></script>

+1

工作正常!謝謝:) – wawanopoulos

+0

有時候,這段代碼會返回:'Uncaught TypeError:xvalue.localCompare不是函數' – wawanopoulos

+0

@wawanopoulos:它應該是'localeCompare',而不是'localCompare'。代碼片段是正確的,但頂部的代碼示例是錯誤的,對此感到遺憾 - 現在已經修復。 –

1

一次不要做的一切。

fav_list.sort(function(x,y) { 
    var xname = x.name || x.nickname || "\uffff"+x.number; 
    var yname = y.name || y.nickname || "\uffff"+y.number; 
    return xname.localeCompare(yname); 
}); 

"\uffff"是迫使數去末;)

+0

我會很樂意'localeCompare'和'\ uffff'全局工作。但這仍然非常有創意和簡潔。 :-)最後按字母順序對數字進行排序(在10之前爲2),但如果它很重要,則可輕鬆進行調整。 –

-1

你colud各地嘗試的工作。

var numbers = [];  
fav_list.sort(function(x, y) { 
      if(!isNaN(x)){ 
       numbers.push(x); 
      continue; 
      } 
        return (x.participant.name || x.participant.nickname).localeCompare(y.participant.name || y.participant.nickname); 
       }); 
    fav_list.push(numbers); 
0

的代碼可以寫爲:

\uffff is directly interpreted as the desired string, and the whole sequence is realized as a single character

var participant0 = { 
 
    name : "", 
 
    nickname : "", 
 
    number: "99999" 
 
} ; 
 

 
var participant1 = { 
 
    name : "bbb", 
 
    nickname : "" 
 
} ; 
 

 
var participant2 = { 
 
    name : "", 
 
    nickname : "aaa" 
 
} ; 
 

 
var participant3 = { 
 
    name : "ccc", 
 
    nickname : "" 
 
} ; 
 
var array = [participant0, participant3, participant1, participant2]; 
 
console.log(array.sort(function(x,y) { 
 
    var val1 = x.name || x.nickname || "\uffff"+x.number; 
 
    var val2 = y.name || y.nickname || "\uffff"+y.number; 
 
    return xname.localeCompare(val2); 
 
}))
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>

0
function sortObject(object) { // sort Object by key 
    var sorted = {}, 
     key, a = []; 
    for (key in object) { 
     if (object.hasOwnProperty(key)) { 
      a.push(key); 
     } 
    } 
    a.sort(); 
    for (key = 0; key < a.length; key++) { 
     sorted[a[key]] = object[a[key]]; 
    } 
    return sorted; 
} 

function sortArray(arr){//sort array of objects 
    var array=[]; 
    for(var i=0;i<arr.length;i++){ 
     array.push(sortObject(arr[i])); 
    } 
    return array; 
} 

var arr=[{a:'1',c:'2',b:'3'},{c:'1',b:'2',a:'3'}]; 
console.log('===>',sortArray(arr));