Javascript 查看数组是否包含对象的更好方法?
我有一个项目数组(Javascript 查看数组是否包含对象的更好方法?,javascript,arrays,object,Javascript,Arrays,Object,我有一个项目数组(术语),它将作为标签放在中。如果这些项中的任何一项位于另一个数组(termsAlreadyTaking)中,则应首先删除它们。我是这样做的: // If the user has a term like "Fall 2010" already selected, we don't need that in the list of terms to add. for (var i = 0; i < terms.length; i++) {
术语)
,它将作为
标签放在
中。如果这些项中的任何一项位于另一个数组(termsAlreadyTaking
)中,则应首先删除它们。我是这样做的:
// If the user has a term like "Fall 2010" already selected, we don't need that in the list of terms to add.
for (var i = 0; i < terms.length; i++)
{
for (var iAlreadyTaking = 0; iAlreadyTaking < termsAlreadyTaking.length; iAlreadyTaking++)
{
if (terms[i]['pk'] == termsAlreadyTaking[iAlreadyTaking]['pk'])
{
terms.splice(i, 1); // remove terms[i] without leaving a hole in the array
continue;
}
}
}
中间之所以有一点冗长的原因是,<代码> $.NARAYAY()/CUT>返回false,因为我寻找的副本在
var terms = $.grep(terms, function(el)
{
return $.inArray(el, termsAlreadyTaking) == -1;
});
这仍然具有m*n性能(m和n是数组的长度),但只要它们相对较小,就不会有什么大不了的。要获得m+n,可以使用哈希表
请注意,ECMAScript提供了类似的数组。和数组。。但是,它们还没有在所有浏览器中实现,因此您必须使用MDC实现作为后备方案。因为您使用的是jQuery,所以grep和inArray(在可用时使用本机indexOf)更容易
编辑:
你可以做:
var response_chosen_pk = $.map(response_chosen_items, function(elem)
{
return elem.pk;
});
var options_for_selector = $.grep(all_possible_choices, function(elem)
{
return $.inArray(elem.pk, response_chosen_pk) == -1;
});
这仍然具有m*n性能(m和n是数组的长度),但只要它们相对较小,就不会有什么大不了的。要获得m+n,可以使用哈希表
请注意,ECMAScript提供了类似的数组。和数组。。但是,它们还没有在所有浏览器中实现,因此您必须使用MDC实现作为后备方案。因为您使用的是jQuery,所以grep和inArray(在可用时使用本机indexOf)更容易
编辑:
你可以做:
var response_chosen_pk = $.map(response_chosen_items, function(elem)
{
return elem.pk;
});
var options_for_selector = $.grep(all_possible_choices, function(elem)
{
return $.inArray(elem.pk, response_chosen_pk) == -1;
});
在termsAlreadyTaking上创建一个jOrder表,并用pk索引它
var table = jOrder(termsAlreadyTaking)
.index('pk', ['pk']);
然后,您可以更快地搜索:
...
if ([] == table.where([{ pk: terms[i].pk }]))
{
...
}
...
在termsAlreadyTaking上创建一个jOrder表,并用pk索引它
var table = jOrder(termsAlreadyTaking)
.index('pk', ['pk']);
然后,您可以更快地搜索:
...
if ([] == table.where([{ pk: terms[i].pk }]))
{
...
}
...
IE是否支持数组上的
indexOf
?找到了-。可能应该使用$.inArray
来避免这个问题。@Matchu,你是对的。我改为inArray(虽然你也可以使用MDC实现作为备用)。@Matchu,indexOf
在任何IE版本上都不适用于数组对象,它刚刚在IE9平台Preview 3上实现,看起来很有希望…@CMS-hmm,这也是我的想法,但链接的答案有所不同。我猜我们发现了一个错误-谢谢:)IE是否支持数组上的indexOf
?找到了-。可能应该使用$.inArray
来避免这个问题。@Matchu,你是对的。我改为inArray(虽然你也可以使用MDC实现作为备用)。@Matchu,indexOf
在任何IE版本上都不适用于数组对象,它刚刚在IE9平台Preview 3上实现,看起来很有希望…@CMS-hmm,这也是我的想法,但链接的答案有所不同。我猜我们发现了一个错误-谢谢:)splice
速度不太快。最好将所选项目添加到新数组中,而不是从原始数组中删除其余项目。splice
的速度并不快。最好将所选项添加到新数组中,而不是从原始数组中删除其余项。