2015-12-20 93 views
1

我想通過它的值排序列表,但我不明白爲什麼它不起作用,一旦我改變它。jQuery對象.sort()不排序

一旦將a和b部分更改爲ipArray [a/b.value],沒有任何東西被排序。

我可以證實,所有的選項值存在於ipArray因爲我能夠通過使用selectList.each(function(){ alert(ipArray[$(this).val()].ipAdd) )

ipArray is an array that has objects of this format 

{ 
    ipAdd : "", 
    network : "" 
} 

id = id of the entry 
eg. ipArray[id] = { ip : "1.2.3.4", network: "test network"}; 


// Example 
var id = $("#list"); 
var selectList = $("option", id); 

selectList.sort(function (a, b) { 

    a = a.value; 
    b = b.value; 

    // Doesn't work. Would like to sort by network name then by ip address 
    //a = ipArray[a.value].ipAdd; 
    //b = ipArray[b.value].ipAdd; 

    return a - b; 
}); 

id.html(selectList); 

編輯以獲取這些值:

創建一個小提琴https://jsfiddle.net/bme4rv6o/12/ 隨着預期輸出

+0

你能提供一個更大的樣本數據嗎? selectList中預期的是什麼?您的示例對象與您在示例中提供的對象不同。 – Aaronepower

+0

增加了預期輸出的小提琴。 – Tim

回答

1

首先,請注意a.value是一個字符串。解析爲int並從中減1,然後將結果用作索引。

最後,使用localeCompare來排序字符串,而不是減法。

小提琴:https://jsfiddle.net/bme4rv6o/13/

此外,你可能需要增加更多的邏輯排序函數來處理領帶(EG,當兩個ab相等,返回一個IP對比(這也需要適當的解析由點分隔的每個令牌))。

2

您正在使用屬性value進行排序,該屬性甚至不存在於object

selectList.sort(function (a, b) { 

    var _network = a.network.localCompare(b.network); 
    var _ip = a.ip.localCompare(b.ip); 

    // Will first check network, if equal will then check IP 
    return (_network==0?_ip:_network);  

}); 
+0

試過這個,但沒有奏效。由於selectList只有索引而不是對象本身,所以我不能只是.ip或.network它。 – Tim

+0

請將您的selectList粘貼到原始文章中。 – void

+0

創建一個小提琴,看看它。 – Tim

0

只需一個代碼行:

它評估的第一部分,並且如果網絡是相同的,那麼其它部分進行評價。

selectList.sort(function (a, b) { 
    return a.network.localeCompare(b.network) || a.ipAdd.localeCompare(b.ipAdd); 
}); 

該算法工作正常,見下文。但是你的selectList確實包含一個對象,它不能按照你的喜好排序。

var ipArray = []; 
 

 
function add(ip, network) { 
 
    ipArray.push({ ip: ip, network: network }); 
 
} 
 

 
add("1.1.1.1", "A"); 
 
add("2.2.2.2", "B"); 
 
add("3.3.3.3", "D"); 
 
add("4.4.4.4", "C"); 
 
add("5.5.5.5", "A"); 
 

 
ipArray.sort(function (a, b) { 
 
    return a.network.localeCompare(b.network) || a.ip.localeCompare(b.ip); 
 
}); 
 

 
document.write('<pre>' + JSON.stringify(ipArray, 0, 4) + '</pre>');

+0

試過這個,但沒有奏效。由於selectList只有索引而不是對象本身,所以我不能只是.ip或.network它。 – Tim

+0

@Tim,你的對象'selectList'不可排序。 –

+0

因此,在排序方法中不可能使用A和B值從數組中獲取對象? – Tim