[英]Advanced object sorting
我正在用力撞牆,試圖解決這個問題...基本上,我有一個結構類似於以下的對象:
results = {
1 : {
url : '/',
matches: {
title : true,
h1 : false,
copy : 2
}
},
2 : {
url : '/?id=2',
matches: {
title : true,
h1 : true,
copy : 0
}
},
3 : {
url : '/id=3',
matches: {
title : false,
h1 : false,
copy : 6
}
}
}
這是來自自定義搜索的結果集。 我需要根據對象內的匹配結果對權重進行關聯。 結果應該像這樣排序:
具有matchs.title == true的結果是最高的結果。 在此子集中,matches.h1為true表示權重最大(最頂部),其次是頁面副本內的出現次數(matches.copy)。
具有matchs.h1 == true的結果將在結果視圖中顯示,然后按頁面副本(matches.copy)中出現的次數排序。
matchs.title和matches.h1均為false的結果在matches.copy中按降序排序。
這對當前的對象結構可行嗎? 還是我需要將其拆分並交叉引用每個子集? 加! 太早了,咖啡不起作用:(
編輯:將結果集轉換為對象數組。 新結構:
results = [
{ pageid: 1, url: '/', matches: { title: true, h1: false, copy: 2 } },
{ pageid: 2, url: '/?id=2', matches: { title: true, h1: true, copy: 0 } },
{ pageid: 3, url: '/?id=3', matches: { title: false, h1: false, copy: 6 } }
]
排序仍在逃避我。 我之前已經做過簡單的排序,但到目前為止沒有任何進展。 我遇到了LINQ,它看起來很有前途,但是我沒有使用它的經驗。 不確定這是否是正確的方向。
我建議改為使用為有序列表設計的數組。
您可以使用.sort
並提供自定義搜索功能: http : //jsfiddle.net/uR4Jn/2/ 。
如果另一個元素具有.title === false
則首先嘗試將具有.title === true
的元素上.title === false
。 否則,如果另一個元素具有.h1 === false
,則嘗試上移具有.h1 === true
的元素。 最后,對.copy
排序。 (並且,如果情況相反,則在前兩種情況下將項目向下移動。)
var results = [
{
url : '/',
matches: {
title : true,
h1 : false,
copy : 2
}
},
{
url : '/?id=2',
matches: {
title : true,
h1 : true,
copy : 0
}
},
{
url : '/id=3',
matches: {
title : false,
h1 : false,
copy : 6
}
},
{
url : '/id=3',
matches: {
title : false,
h1 : false,
copy : 7
}
}
];
results = results.sort(function(a, b) {
return (a.matches.title && !b.matches.title ? -1
: (!a.matches.title && b.matches.title ? 1
: (a.matches.h1 && !b.matches.h1 ? -1
: (!a.matches.h1 && b.matches.h1 ? 1
: b.matches.copy - a.matches.copy))));
});
通過調用
results.sort(function(a, b) { ... });
很容易
然后將適當的邏輯添加到回調中:如果a <b,則返回-1;如果a> b,則返回1;如果a == b,則返回0。
JavaScript中的對象未排序。 如果需要特定順序,則需要將其轉換為數組:
var resultList = [];
for(var elem in results) {
resultList.push(results[elem]);
}
resultList.sort(function(a, b) {
// perform your sorting
});
由於對象是通過引用傳遞的,因此您仍然可以使用results[..]
訪問對象之一。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.