2013-12-20 139 views
0

我有兩個逗號分隔的列表,第一個列表是可能的值列表,第二列列出了「selected」值。我需要創建第一個列表中不存在於第二個列表中的所有項目的列表。獲取不在另一個列表中的項目列表

我可以將第一個列表拆分爲一個數組,並使用「for」通過使用string_pos遍歷列表來查看第一個列表項是否包含在第二個列表中,但是我想知道是否存在更有效的方式來實現這一點。

謝謝!

+0

將第二個列表轉換爲屬性爲其元素的對象。然後遍歷第一個列表,檢查它們是否在對象中。 – Barmar

回答

1

你想要做的第一件事是將兩個逗號分隔的列表拆分爲字符串數組。假設他們是相當合理的格式,你可以用

possible_values = possible_string.split(/,\s?/) //split on commas with a possible space 
selected_values = selected_string.split(/,\s?/) 

如果您願意使用以外的圖書館這樣做,underscore.js有一個極好的功能。您所描述的操作是設置的差異運算符,它是下劃線中的difference function

你想要的結果是調用

_.difference(possible_values, selected_values) 
1

如果你正在尋找最好的方式的返回值,這是你必須做的

  1. 轉換列表是什麼在班輪時間內檢查一個物體。因爲,對象是技術上的哈希表,它提供了更快的查找O(1))。

  2. 然後,迭代第一個列表並檢查當前元素是否存在於對象中。如果不存在,請將其添加到結果中。

    var list1 = [1, 2, 3], list2 = [1, 2], dict2 = {}; 
    
    list2.forEach(function(item) { 
        dict2[item] = true; 
    }); 
    
    var result = list1.reduce(function(prev, current) { 
        if (dict2.hasOwnProperty(current) === false) { 
         prev.push(current); 
        } 
        return prev; 
    }, []) 
    
    
    console.log(result); 
    

輸出

[ 3 ] 
1

您可以過濾列表可能。

如果列表是字符串,則將它們拆分或匹配以獲取數組。

var possible=[1,2,3,4], 
selected=[2,4]; 

var unchosen=possible.filter(function(itm){ 
    return selected.indexOf(itm)==-1; 
}); 

unchosen 

/* returned value: (Array) 
1,3 
*/ 
+0

過濾器在ES5中是新的,因此可能需要爲IE8和更老的版本進行填充,您應該提到這一事實。 – Entoarox

相關問題