我有兩個逗號分隔的列表,第一個列表是可能的值列表,第二列列出了「selected」值。我需要創建第一個列表中不存在於第二個列表中的所有項目的列表。獲取不在另一個列表中的項目列表
我可以將第一個列表拆分爲一個數組,並使用「for」通過使用string_pos遍歷列表來查看第一個列表項是否包含在第二個列表中,但是我想知道是否存在更有效的方式來實現這一點。
謝謝!
我有兩個逗號分隔的列表,第一個列表是可能的值列表,第二列列出了「selected」值。我需要創建第一個列表中不存在於第二個列表中的所有項目的列表。獲取不在另一個列表中的項目列表
我可以將第一個列表拆分爲一個數組,並使用「for」通過使用string_pos遍歷列表來查看第一個列表項是否包含在第二個列表中,但是我想知道是否存在更有效的方式來實現這一點。
謝謝!
你想要做的第一件事是將兩個逗號分隔的列表拆分爲字符串數組。假設他們是相當合理的格式,你可以用
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)
如果你正在尋找最好的方式的返回值,這是你必須做的
轉換列表是什麼在班輪時間內檢查一個物體。因爲,對象是技術上的哈希表,它提供了更快的查找O(1))。
然後,迭代第一個列表並檢查當前元素是否存在於對象中。如果不存在,請將其添加到結果中。
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 ]
您可以過濾列表可能。
如果列表是字符串,則將它們拆分或匹配以獲取數組。
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
*/
過濾器在ES5中是新的,因此可能需要爲IE8和更老的版本進行填充,您應該提到這一事實。 – Entoarox
將第二個列表轉換爲屬性爲其元素的對象。然後遍歷第一個列表,檢查它們是否在對象中。 – Barmar