高级对象排序
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
}
}
}
这是自定义搜索的结果集。我需要结果具有基于对象内匹配的相关性权重。结果应该这样排序:
具有matches.title==true的结果是最上面的结果。在这个子集中,matches.h1为true的权重最大(最高),其次是页面副本中出现的次数(matches.copy)。
具有matches.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,它看起来很有前途,但我没有使用它的经验。不确定这是否是正确的方向。
我建议使用数组,它是为有序列表设计的。
您可以使用.sort
并提供自定义搜索功能:http://jsfiddle.net/uR4Jn/2/.
如果另一个元素具有.title === false
,则首先尝试向上移动具有.title === true
的元素。否则,如果另一个元素具有.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) { ... });
,然后向回调添加适当的逻辑,这很容易实现:如果<b、 如果a>b、 如果a==b,则为0
JavaScript中的对象没有排序。如果你想要一个特定的订单,你需要将其转换为数组:
var resultList = [];
for(var elem in results) {
resultList.push(results[elem]);
}
resultList.sort(function(a, b) {
// perform your sorting
});
由于对象是通过引用传递的,因此您仍然可以使用results[..]
来访问其中一个对象。
- 在循环Handlebars之前重新排序对象键
- 将SortedMap从Java转换为Javascript中可读的排序对象
- 模仿`overflow-y:auto;overflow-x:visible `在jQuery UI可排序对象上
- Javascript排序对象日期
- Jquery UI:如何指示可拖动对象成功拖放到可排序对象上
- 删除数组中重复的未排序对象
- Javascript 递归地排序对象和嵌套对象以及数组
- 如何在目标可排序对象接收后获取拖动项的类
- Javascript:排序对象挑战
- 在 JavaScript 中合并多个排序对象数组的最有效方法是什么?
- 如何在角度UI中加载保存的可排序对象
- 任意重新排序和排序对象文字的 JavaScript 数组
- 使用下划线在javascript中重新排序对象
- 排序对象的多维数组与一个可变的深度在Javascript
- 在javascript中,排序对象不会传递给字符串变量
- JavaScript快速排序对象
- 在JavaScript数组中按键值排序对象
- 用布尔值排序对象
- 如何在D3.js中通过JSON文件解析按键排序对象
- Javascript如何按键排序对象,但不破坏原始对象的顺序