首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >选择具有值数组的所有元素的最有效方法

选择具有值数组的所有元素的最有效方法
EN

Stack Overflow用户
提问于 2012-09-04 11:02:41
回答 8查看 7.3K关注 0票数 3

假设我有一个<select>元素:

代码语言:javascript
运行
复制
<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>

假设我有一个值数组,如下所示:

代码语言:javascript
运行
复制
var optionValues = [2, 3];

如何才能最有效地选择值为2和3的<option>

我正在使用一个有数千个<option><select>,所以像这样手动操作是行不通的:

代码语言:javascript
运行
复制
var optionElements = [];

$("#foobar").children().each(function() {
    if($.inArray($(this).val(), optionValues)) {
        optionElements.push($(this));
    }
}

它太慢了。有没有办法给jQuery一个我需要选择的元素的值列表?有什么想法吗?

另外,如果你想知道,我正在优化我的jQuery PickList widget,它现在是sucks at handling large lists

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2012-09-04 11:48:23

首先,我想感谢你们所有令人惊叹的回复!我正在考虑每一个问题,我可能会在做出决定之前做一些基准测试。

在此期间,我实际上找到了另一个问题的“可接受的”解决方案based on this answer

下面是我想出来的(最后一个块,带有自定义的filter()实现,魔术就是在这里发生的):

代码语言:javascript
运行
复制
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。

票数 1
EN

Stack Overflow用户

发布于 2012-09-04 11:25:44

你有没有考虑过在plugin bootstrap上创建一个大的哈希表?授权值是唯一的:

代码语言:javascript
运行
复制
var options = {};

$('#foobar').children().each(function(){

    options[this.value] = this;

});

这种查找方式很简单-- options[valueNeeded]

编辑-搜索optionValues

代码语言:javascript
运行
复制
var optionValues = [2, 3];

var results = [];

for(i=0; i<optionValues.length;i++){

    results.push[ options[ optionValues[i] ] ];

}
票数 3
EN

Stack Overflow用户

发布于 2012-09-04 11:11:00

假设这些值是唯一的,您可以走捷径。例如,一旦你找到了一个值,你就可以通过从搜索数组中splice()它来停止搜索它。

不过,这将是最终的优化,将您从O(n^2)一直带到O(n log n):排序。

首先,遍历选项并构建一个数组。基本上,您只需要将NodeList转换为数组。然后,使用回调对数组执行sort操作,以获取选项的值。对搜索数组进行排序。现在,您可以遍历"options“数组并查找当前最小的搜索项。

代码语言:javascript
运行
复制
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();
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12256246

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档