假设我有一个<select>元素:
<select id="foobar" name="foobar" multiple="multiple">
<option value="1">Foobar 1</option>
<option value="2">Foobar 2</option>
<option value="3">Foobar 3</option>
</select>假设我有一个值数组,如下所示:
var optionValues = [2, 3];如何才能最有效地选择值为2和3的<option>?
我正在使用一个有数千个<option>的<select>,所以像这样手动操作是行不通的:
var optionElements = [];
$("#foobar").children().each(function() {
if($.inArray($(this).val(), optionValues)) {
optionElements.push($(this));
}
}它太慢了。有没有办法给jQuery一个我需要选择的元素的值列表?有什么想法吗?
另外,如果你想知道,我正在优化我的jQuery PickList widget,它现在是sucks at handling large lists。
发布于 2012-09-04 11:48:23
首先,我想感谢你们所有令人惊叹的回复!我正在考虑每一个问题,我可能会在做出决定之前做一些基准测试。
在此期间,我实际上找到了另一个问题的“可接受的”解决方案based on this answer。
下面是我想出来的(最后一个块,带有自定义的filter()实现,魔术就是在这里发生的):
var items = self.sourceList.children(".ui-selected");
var itemIds = [];
items.each(function()
{
itemIds.push( this.value );
});
self.element.children().filter(function()
{
return $.inArray(this.value, itemIds) != -1;
}).attr("selected", "selected");我怀疑这是否像你们发布的任何东西一样高效,但它已经将1500个项目列表上的“添加”选择列表的操作时间从大约10秒减少到300ms。
发布于 2012-09-04 11:25:44
你有没有考虑过在plugin bootstrap上创建一个大的哈希表?授权值是唯一的:
var options = {};
$('#foobar').children().each(function(){
options[this.value] = this;
});这种查找方式很简单-- options[valueNeeded]。
编辑-搜索optionValues
var optionValues = [2, 3];
var results = [];
for(i=0; i<optionValues.length;i++){
results.push[ options[ optionValues[i] ] ];
}发布于 2012-09-04 11:11:00
假设这些值是唯一的,您可以走捷径。例如,一旦你找到了一个值,你就可以通过从搜索数组中splice()它来停止搜索它。
不过,这将是最终的优化,将您从O(n^2)一直带到O(n log n):排序。
首先,遍历选项并构建一个数组。基本上,您只需要将NodeList转换为数组。然后,使用回调对数组执行sort操作,以获取选项的值。对搜索数组进行排序。现在,您可以遍历"options“数组并查找当前最小的搜索项。
var optsNodeList = document.getElementById('foobar').options,
optsArray = [], l = optsNodeList.length, i,
searchArray = [2,3], matches = [], misses = [];
for( i=0; i<l; i++) optsArray[i] = optsNodeList[i];
optsArray.sort(function(a,b) {return a.value < b.value ? -1 : 1;});
searchArray.sort();
while(searchArray[0] && (i = optsArray.shift())) {
while( i > searchArray[0]) {
misses.push(searchArray.shift());
}
if( i == searchArray[0]) {
matches.push(i);
searchArray.shift();
}
}https://stackoverflow.com/questions/12256246
复制相似问题