我正在撞墙试图解决这个问题......基本上,我有一个具有类似结构的物体:
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
}
}
}
这是自定义搜索的结果集。我需要结果根据对象内的匹配来获得相关性的权重。结果应按如下方式排序:
匹配match.title == true的结果是最重要的结果。在这个子集中,matches.h1为true,最重要(最顶层),后面是页面副本中出现的次数(matches.copy)。
results.h1 == true的结果将在结果视图中显示下一个,按页面副本中出现的次数排序(matches.copy)。
matches.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,看起来很有希望,但我没有使用它的经验。不确定这是否正确。
答案 0 :(得分:5)
我建议使用数组,它是为有序列表设计的。
您可以使用.sort
并提供自定义搜索功能:http://jsfiddle.net/uR4Jn/2/。
如果另一个元素具有.title === true
,首先尝试向上移动具有.title === false
的元素。否则,如果其他元素具有.h1 === true
,请尝试向上移动具有.h1 === false
的元素。最后,只需按.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))));
});
答案 1 :(得分:1)
通过调用 results.sort(function(a, b) { ... });
然后向回调添加适当的逻辑很容易:如果a< b则返回-1,如果a> b则返回0,如果a == b,则返回0。
JavaScript中的对象未订购。如果需要特定订单,则需要将其转换为数组:
var resultList = [];
for(var elem in results) {
resultList.push(results[elem]);
}
resultList.sort(function(a, b) {
// perform your sorting
});
由于对象是通过引用传递的,因此您仍然可以使用results[..]
来访问其中一个对象。