我有一系列对象:
var people = [
{ name: "John", number: "256", date: "04/08/2013" },
{ name: "Bill", number: "311", date: "04/07/2013" },
{ name: "Mike", number: "127", date: "04/02/2013" }
];
我想将jQuery-UI自动完成功能添加到以下input
元素:
<input type="text" id="person-search" />
它接线如下:
$('#person-search').autocomplete({
source: people
});
自动完成小部件的jQuery-UI文档声明我必须在数组中的每个对象上都有标签和值属性。我真的不想回去添加这些额外的属性。我不相信我也应该这样做。
为了满足jQuery-UI,必须改变我的数据源似乎是浪费和错误。
有没有一种方法可以告诉jQuery-UI自动完成在搜索属性name
和number
时过滤而不向对象添加属性? (这些对象在别处使用,可能是数千个元素的数组)
我注意到为source
选项提供函数的选项,但是基本上不会跳过jQuery-UI自动完成中的缓存和内置优化过滤? jQuery UI自动完成甚至有这些东西,还是那个神话?在那一点似乎,我可能只是重新发明轮子。
应该有一种简单的方法告诉它使用不同的属性名称。我忽略了什么吗?我是唯一一个对这个看似显而易见的功能感到沮丧的人吗?
答案 0 :(得分:2)
当然可以。您可以使用jQuery map
将起始项数组或对象转换为新的项数组,而不是使用grep
应用输入过滤器。
当前过滤器存储在request
,source
函数参数中。
价:
将数组或对象中的所有项目转换为新的项目数组。
和
查找满足过滤函数的数组元素。该 原始数组不受影响。
代码:
$('#personsearch').autocomplete({
source: function (request, response) {
var re = $.ui.autocomplete.escapeRegex(request.term);
var matcher = new RegExp("^" + re, "i");
response($.grep(($.map(people, function (v, i) {
return {
label: v.name,
value: v.name
};
})), function (item) {
return matcher.test(item.value);
}))
}
});