2010-07-04 89 views
0

我有一系列物品(terms),这些物品将作为<option>标签放在<select>中。如果这些物品中有任何物品在另一个阵列中(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; 
      } 
     } 
    }  

有没有更好的方式来做到这一点?这感觉有点笨拙。

我使用jQuery,如果它的确与众不同。

UPDATE基于@Matthew富兰琛的回答:

// If the user has a term like "Fall 2010" already selected, we don't need that in the list of terms to add. 
var options_for_selector = $.grep(all_possible_choices, function(elem) 
          { 
           var already_chosen = false; 
           $.each(response_chosen_items, function(index, chosen_elem) 
           { 
            if (chosen_elem['pk'] == elem['pk']) 
            { 
             already_chosen = true; 
             return; 
            } 
           }); 
           return ! already_chosen; 
          }); 

它会在中间更详细一点的原因是$.inArray()正在恢复假的,因为我在寻找重复的不严格相等彼此在==感。但是,他们的所有价值都是一样的。我可以使这更简洁吗?

+2

'splice'是不完全的快。将所选项目添加到新数组可能会更好,而不是从原始数据中删除其余项目。 – casablanca 2010-07-04 05:23:43

回答

3
var terms = $.grep(terms, function(el) 
      { 
       return $.inArray(el, termsAlreadyTaking) == -1; 
      }); 

这仍然有m * n的性能(m和n是数组的长度),但只要它们相对较小就不会有什么大不了的。要获得m + n,您可以使用散列表

请注意,ECMAScript提供了类似的Array。 filter和Array。 indexOf。但是,它们尚未在所有浏览器中实现,所以您将不得不使用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; 
}); 
+1

IE是否支持数组上的'indexOf'? – Matchu 2010-07-04 05:18:54

+0

发现它 - [除IE6以外的所有工作](http://stackoverflow.com/questions/143847/best-way-to-find-an-item-in-a-javascript-array/143863#143863)。应该使用'$ .inArray'来避免这个问题。 – Matchu 2010-07-04 05:20:11

+0

@Matchu,你是对的。我更改为inArray(尽管您也可以使用MDC实现作为回退)。 – 2010-07-04 05:24:43

0

http://github.com/danstocker/jorder

上termsAlreadyTaking创建jOrder表,并与PK指数吧。

var table = jOrder(termsAlreadyTaking) 
    .index('pk', ['pk']); 

然后,你可以查找更快:

... 
if ([] == table.where([{ pk: terms[i].pk }])) 
{ 
    ... 
} 
... 
相关问题