摘要:下面函數(shù)采用了遞歸如果文字超出寬度,在函數(shù)中將原字符截斷末尾字符并加上再次調(diào)用判斷是否超出寬度。直至獲得寬度合適的字符串并輸出。需要優(yōu)化的遞歸函數(shù)超出寬度這樣看起來沒問題。其實需要優(yōu)化很多地方。
現(xiàn)在有一個需求:
如果“一個字符串”超出“容器寬度”,將字符串截斷最后一個字符、并在末尾加上‘...’ ,再次判斷是否需要截斷。直至字符串小于容器寬度。
下面SliceLabelStr函數(shù)采用了遞歸:
如果文字超出寬度,在attrStyle函數(shù)中將原字符截斷末尾字符并加上‘...’ 再次調(diào)用sliceLabelStr判斷是否超出寬度。
直至獲得寬度合適的字符串并輸出。
需要優(yōu)化的遞歸函數(shù) sliceLabelStr = function( textWidth, textStr) { var str; if(超出寬度) { dataLabel2 = attrStyle(textStr); var newTextWidth = dataLabel2.text && dataLabel2.text.element.getBoundingClientRect().width; var textStr = dataLabel2.text.textStr; sliceLabelStr( newTextWidth, textStr); } else { str = attrStyle(textStr, true); return str; } }
這樣看起來沒問題。其實需要優(yōu)化很多地方。
1、遞歸沒有出口
這個遞歸函數(shù)被調(diào)用了10遍,在11遍的時候符合了出口條件退出了,
那么在第10遍沒退出的時候,1到10次的函數(shù)都沒有退出,只有在第11遍符合了出口條件return了以后,就會從11~1倒著依次退出
附上一張?zhí)柹袷謱懙慕忉寛D
優(yōu)化方法1 if(textWidth > containerWidth) { dataLabel2 = attrStyle(textStr); var newTextWidth = dataLabel2.text && dataLabel2.text.element.getBoundingClientRect().width; var textStr = dataLabel2.text.textStr; return sliceLabelStr( newTextWidth, textStr);//有返回值 }
1、上述原因是遞歸沒有出口,而且if語句中調(diào)用本函數(shù)遞歸的時候沒有返回值。
2、有時會產(chǎn)生“調(diào)用棧溢出”的情況。
2、在if判斷條件中,由于在某種情況下textWidth沒有變化造成了無限遞歸
3、用do...while 代替 遞歸
sliceLabelStr = function(forX2Array, textWidth, textStr) { var str, sliceStr = textStr.text && textStr.text.textStr || textStr; if(compareTextLength(forX2Array, textWidth)) { var n=0; do{ n++; } while(sliceStr.substr(0,n)!=sliceStr && attrLabel2Style(forX2Array[0], sliceStr.substr(0,n)).getBBox()["width"]邏輯比較直觀,簡單能用循環(huán)的就用循環(huán),遞歸一般用在復(fù)雜算法,比如弗洛伊德,A+之類
4、這是SVGElement,如果是普通的DOM元素??梢杂萌缦路椒?。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/81474.html
摘要:正是前人的努力,我們現(xiàn)在的編程才會如此的容易。讀懂他人代碼算法如果別人是大牛,數(shù)學(xué)學(xué)得很好,很多數(shù)學(xué)公式,很多遞歸,如果自己沒有一定的數(shù)學(xué)基礎(chǔ),可能就暈了,這個時候,數(shù)學(xué)的基本功可能就會在這里發(fā)揮作用了。 作者:caoglish原文鏈接:http://t.cn/RKcyGX3來源:知乎 查詢和閱讀文檔能力 原因:你使用編程來解決問題的時候,基本上最終的東西是代碼,但是編程的知識太廣,總...
摘要:正是前人的努力,我們現(xiàn)在的編程才會如此的容易。讀懂他人代碼算法如果別人是大牛,數(shù)學(xué)學(xué)得很好,很多數(shù)學(xué)公式,很多遞歸,如果自己沒有一定的數(shù)學(xué)基礎(chǔ),可能就暈了,這個時候,數(shù)學(xué)的基本功可能就會在這里發(fā)揮作用了。 作者:caoglish原文鏈接:http://t.cn/RKcyGX3來源:知乎 查詢和閱讀文檔能力 原因:你使用編程來解決問題的時候,基本上最終的東西是代碼,但是編程的知識太廣,總...
摘要:正是前人的努力,我們現(xiàn)在的編程才會如此的容易。讀懂他人代碼算法如果別人是大牛,數(shù)學(xué)學(xué)得很好,很多數(shù)學(xué)公式,很多遞歸,如果自己沒有一定的數(shù)學(xué)基礎(chǔ),可能就暈了,這個時候,數(shù)學(xué)的基本功可能就會在這里發(fā)揮作用了。 作者:caoglish原文鏈接:http://t.cn/RKcyGX3來源:知乎 查詢和閱讀文檔能力 原因:你使用編程來解決問題的時候,基本上最終的東西是代碼,但是編程的知識太廣,總...
摘要:正是前人的努力,我們現(xiàn)在的編程才會如此的容易。讀懂他人代碼算法如果別人是大牛,數(shù)學(xué)學(xué)得很好,很多數(shù)學(xué)公式,很多遞歸,如果自己沒有一定的數(shù)學(xué)基礎(chǔ),可能就暈了,這個時候,數(shù)學(xué)的基本功可能就會在這里發(fā)揮作用了。 作者:caoglish原文鏈接:http://t.cn/RKcyGX3來源:知乎 查詢和閱讀文檔能力 原因:你使用編程來解決問題的時候,基本上最終的東西是代碼,但是編程的知識太廣,總...
摘要:是否啟用安全模式。提示此參數(shù)已經(jīng)沒有了關(guān)閉危險函數(shù)如果打開了安全模式,那么函數(shù)禁止是不需要的,但是我們?yōu)榱税踩紤]還是設(shè)置。 1、PHP引擎緩存加速常見四種軟件:1.eAccelerator2.Zendcache3.xcache4.apc5.zendopcache php5.5自帶2、使用tmpfs作為緩存加速緩存的文件目錄[root@web02 ~]# mount -t tmpfs ...
閱讀 2483·2021-11-17 09:33
閱讀 768·2021-11-04 16:13
閱讀 1340·2021-10-14 09:50
閱讀 705·2019-08-30 15:53
閱讀 3674·2019-08-30 14:18
閱讀 3276·2019-08-30 14:14
閱讀 2108·2019-08-30 12:46
閱讀 3190·2019-08-26 14:05