這是我的第一個想法。
function isSubsetOf(elements, set) {
var i, l = elements.length, pos;
set = set.split('');
for (i = 0; i < l; i += 1) {
pos = set.indexOf(elements.charAt(i));
if (pos == -1) return false;
set.splice(pos, 1);
}
return true;
}
/*-- Algorithm: --*/
// for each character in *elements*:
// remove that character from an array of *set*'s characters
// (and if not found, return false).
但是,我不知道,IE沒有Array.indexOf
,這使得這個可怕的失敗者中的IE瀏覽器性能方面有符合標準的indexOf
功能添加到Array.prototype
。但令我驚訝的是,它只是與Chrome的尖叫,這顯然是一個平均拼接運算機器。
我的第二個想法比我的第一個想法更好,但並不比頁面上的其他人好得多。
function isSubsetOf2(elements, set) {
var i, l, counts = {};
for (i = 0, l = set.length; i < l; i += 1) {
char = set.charAt(i);
counts[char] = (counts[char] || 0) + 1;
}
for (i = 0, l = elements.length; i < l; i += 1) {
char = elements.charAt(i);
if (!counts[char]) return false;
counts[char] -= 1;
}
return true;
}
/*-- Algorithm: --*/
// For each character in *set*:
// increment its count in an object "map".
// For each character in *elements*
// decrement its count in an object map
// (and if < 0 or doesn't exist, return false)
所以,最後,我的第三個想法是最快的Firefox和良好的全方位的競爭者,但不同的瀏覽器顯示不同功能的速度有很大的不同的配置文件。
function isSubsetOf3(elements, sets) {
var e, s, el = elements.length, sl = sets.length;
elements = elements.split('').sort();
sets = sets.split('').sort();
for (e = 0, s = 0; e < el; e += 1, s += 1) {
while (s < sl && sets[s] < elements[e]) { s += 1; }
if (s == sl || sets[s] > elements[e]) { return false };
}
return true;
}
/*-- Algorithm: --*/
// Sort arrays of the characters in *elements* and *set*.
// Do a logical "merge join" (cool!) and:
// if no match is found, return false
// MERGE JOIN:
// For each character in the *elements* array ("left" input)
// Consume one matching character from *set* ("right" input)
// (skipping matches that are less than the character)
// And if *set* runs out of characters or is higher than *element*, return false
如果對輸入進行排序,則合併聯接爲FAST。顯然,在瀏覽器中對兩個數組進行排序比對每個字符串執行多個Regex操作要快。
編輯:我剛剛意識到我的想法#2基本上是Kolink算法的重複。但是,我的功能有一致的性能優勢。分析其差異可能會發現一些有趣的結果。
另外,我發現在#2中,我不應該將counts[char] -= 1;
調高一行,但我不想吹掉我已經在jsperf上獲得的性能結果。所以我要離開它,因爲它不會不公平地扭曲結果,因爲它只會傷害函數的性能。
Do the speed tests yourself at jsperf!
請查看此頁上的所有答案[收視成績(http://jsperf.com/stringissubsetof)。迄今爲止最快的全能是我的第三個想法,儘管不同的瀏覽器/版本有不同的最佳獲勝者。 - ErikE – ErikE 2012-07-13 01:18:30