2010-07-04 86 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 }])) 
{ 
    ... 
} 
... 
相關問題