2014-06-09 42 views
0

JavaScript數組我有一個JavaScript ASSOC陣列(對象)等構建從關聯數組和長串

aa = {"(one)":["a","b","c"], "(two)":["d","e","f"]} 

和類似

s = "(two) blah blah (one) etc (two)" 

我想打開ASSOC陣列成平紋的字符串其排列順序如字符串中所示

newarray = [["d","e","f"] , ["a","b","c"], ["d","e","f"]] 

唯一的是,數組和字符串可能會繼續數以百萬計的項目。如果我使用帶有全局修飾符的string.match執行此操作,然後遍歷結果,我最終會使用大量的內存嗎?有沒有一種方法來迭代字符串中的匹配而不存儲所有匹配的文本(有點像string.search的迭代器版本)?

+0

沒有assoc命令陣列,這是一個對象(再次)。 – adeneo

+0

使用string.split傳遞正則表達式來分割(一),(二)等,也許?然後只是遍歷返回的數組來構建你的newarray? – PulseLab

+0

@adeneo,我使用「assoc array」作爲簡寫。無論如何這都是散列存儲。 – user2667066

回答

1

我想沿着這些線路的東西,基於正則表達式:

var aa = {"(one)":["a","b","c"], "(two)":["d","e","f"]}; 
var s = "(two) blah blah (one) etc (two)"; 
var result = []; 

s.match(/(\(.+?\))/g).forEach(function(match) { 
    result.push(aa[match]); 
}); 
+0

理想情況下,如果s.match()。forEach被編譯器優化爲充當迭代器,而不是存儲所有匹配的中間數組。我懷疑它是這樣優化的。會嘗試。謝謝! – user2667066

+0

是啊不知道這個優化...取決於Javascript引擎,但不知道他們中的任何一個是否會這樣優化它。如果沒有,您可以使用'RegExp.exec()'進行漸進式匹配。 –

+0

啊哈 - 我沒有發現RegExp.exec()進行了漸進式匹配([docs](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/) EXEC#Example.3A_Finding_successive_matches))。這可能正是我需要的。謝謝。 – user2667066

1
var aa = {"(one)":["a","b","c"], "(two)":["d","e","f"]}; 
var s = "(two) blah blah (one) etc (two)" 
var newarray = []; 
var res = s.match(/\((.*?)\)/g); 
var i = 0; 
while (i < res.length){ 
    newarray.push(aa[res[i]]); 
    i++; 
} 
console.log(newarray); 

最後這一個完美的作品。

http://jsfiddle.net/KRzRj/

+0

這根本不考慮字符串。 –

+0

對不起,我的評論太快了。沒意識到你還在編輯。解決方案仍然看起來不正確,但... –

+0

這將按for(key in aa)調用返回的順序構造一個數組。在我的機器上,首先返回(一個),然後(兩個),所以它得到錯誤的命令(newarray = [[「a」,「b」,「c」],[「d」,「e」,「f 「],[」d「,」e「,」f「]]) – user2667066