Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 查看数组是否包含对象的更好方法?_Javascript_Arrays_Object - Fatal编程技术网

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,因为我寻找的副本在>==/Cord>Stand中不严格等同。但是,它们的值都是相同的。我能把这句话说得更简洁些吗

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
的速度并不快。最好将所选项添加到新数组中,而不是从原始数组中删除其余项。