我有许多层的对象。看起来这样:
var array = [
{
fields: { title: "Some title here" },
sys: { id: "1234" }
},
{
fields: { title: "Another one there" },
sys: { id: "13456" }
},
{
fields: { title: "Final example" },
sys: { id: "234" }
},
{
fields: { title: "Most final thing" },
sys: { id: "4665" }
},
];
现在,我想根据fields.title
中是否存在文本来对数组进行排序。例如,我有"最终搜索"一词。需要对数组进行排序,以便当前的array[2]
和array[3]
移至最高位置,因为它们包含"最终"一词。
这类需要包含多个单词。因此,如果我使用短语"最终示例",array[2]
将首先进行,因为它包含两个单词,其次是array[3]
,仅包含"最终"。
这是可能的吗?
是的,这是可能的。
您可以按空格角色将字符串拆分,计算2个生成的数组的相交并将其用于排序。遵循相同逻辑并且应该更快的另一个选项是使用正则表达式和String.prototype.match
方法,例如:
function finder(input) {
var reg = new RegExp(input.trim().split(' ').join('|'), 'gi');
return function(el) {
var m = el.fields.title.match(reg);
return m ? m.length : -1;
}
}
function sortBy(arr, input) {
var find = finder(input);
return arr.sort(function (a, b) {
return find(a) < find(b);
});
}
sortBy(array, "user input");
这是一个演示。
您所描述的内容比标题所建议的要复杂一些 - 使用小文本搜索和排名库,例如Twitter的Bloodhound。