arr和repeatArr都不會(huì)出現(xiàn)重復(fù)項(xiàng),而且repeatArr一定是類似數(shù)學(xué)里的集合,repeatArr是屬于arr的`
var arr = [1, 2, 3, 4, 5];
var repeatArr = [1, 3];
function distinct() {
for (var i = 0; i < arr.length; i++) {
for (var j = 0; j < repeatArr.length; j++) {
if (arr[i] == repeatArr[j]) {
arr.splice(i, 1);
distinct()
return false;
}
}
}
}
distinct();
console.log(arr)demo:鏈接描述
let arr = [1, 2, 3, 4, 5];
let repeatArr = [1, 3];
let s = String.fromCharCode(2);
let reg = new RegExp('(' + s + repeatArr.join(s + ')|(' + s) + s + ')', 'gi');
let str = s + arr.join(s) + s;
let result = str.replace(reg, s);
result = result.substring(1, result.length - 1).split(s);
alert(result);
先說(shuō)一下原來(lái)的代碼。
做一個(gè)雙循環(huán)也并不需要用到遞歸,找到重復(fù)項(xiàng)原地踏步就行!
直接操作外部變量也不是一個(gè)好的選擇!
if (arr[i] == repeatArr[j]) {
arr.splice(i, 1);
i--
break;
}
另外,
去重最常用的像上面說(shuō)的,使用哈希,就不累贅了哈!
其實(shí)你可以從幾個(gè)方面考慮一下上面幾種答案。
1、是否純函數(shù)或者說(shuō)是否直接修改外部變量
2、性能、復(fù)雜度
3、代碼可讀性(這個(gè)不說(shuō)了,大家都有自己的見解)
arr.filter(item => !repeatArr.includes(item))
function fp(origin, repeat) {
return origin.filter(item => !repeat.includes(item))
}
第一種偏函數(shù)式,不影響外部,可以很輕松封裝成函數(shù),也方便復(fù)用!
復(fù)雜度也是O(n^2),上用大白話說(shuō),其實(shí)也就是雙循環(huán)。
var arr = [1, 2, 3, 4, 5];
var repeatArr = [1, 3];
var map = {};
$.map(repeatArr, function(v){map[v] = true})
arr = $.map(arr, function(v){if(!map[v]){return v}})
function hashMapUnique(origin, repeat) {
let map = {};
repeat.map(item => map[item] = true)
return origin.filter(item => !map[item])
}
第二種用也比較容易封裝成函數(shù)
哈希在數(shù)據(jù)訪問(wèn)的時(shí)候比遍歷要快,在處理的量大的情況下,性能優(yōu)于第一種方法
剛剛還看到了第三種使用正則的。
還挺復(fù)雜的,最后數(shù)據(jù)類型也發(fā)生變化了。
沒(méi)有嘗試哈!
最后說(shuō)一下你改以后的方法哈
for (var i = 0; i < repeatArr.length;i++) {
var index = arr.indexOf(repeatArr[i]);
arr.splice(index, 1);
}
就像yszou說(shuō)的你的復(fù)雜度上沒(méi)有優(yōu)勢(shì)!
而且使用了splice方法,直接修改了原始數(shù)組不說(shuō),且這個(gè)方法本身就比較消耗性能的。
用大白話說(shuō),splice在刪除那一項(xiàng)以后,得把該項(xiàng)以后的每一項(xiàng)都前移一位!
可讀性上面我就不評(píng)論了哈·~~~
北大青鳥APTECH成立于1999年。依托北京大學(xué)優(yōu)質(zhì)雄厚的教育資源和背景,秉承“教育改變生活”的發(fā)展理念,致力于培養(yǎng)中國(guó)IT技能型緊缺人才,是大數(shù)據(jù)專業(yè)的國(guó)家
達(dá)內(nèi)教育集團(tuán)成立于2002年,是一家由留學(xué)海歸創(chuàng)辦的高端職業(yè)教育培訓(xùn)機(jī)構(gòu),是中國(guó)一站式人才培養(yǎng)平臺(tái)、一站式人才輸送平臺(tái)。2014年4月3日在美國(guó)成功上市,融資1
北大課工場(chǎng)是北京大學(xué)校辦產(chǎn)業(yè)為響應(yīng)國(guó)家深化產(chǎn)教融合/校企合作的政策,積極推進(jìn)“中國(guó)制造2025”,實(shí)現(xiàn)中華民族偉大復(fù)興的升級(jí)產(chǎn)業(yè)鏈。利用北京大學(xué)優(yōu)質(zhì)教育資源及背
博為峰,中國(guó)職業(yè)人才培訓(xùn)領(lǐng)域的先行者
曾工作于聯(lián)想擔(dān)任系統(tǒng)開發(fā)工程師,曾在博彥科技股份有限公司擔(dān)任項(xiàng)目經(jīng)理從事移動(dòng)互聯(lián)網(wǎng)管理及研發(fā)工作,曾創(chuàng)辦藍(lán)懿科技有限責(zé)任公司從事總經(jīng)理職務(wù)負(fù)責(zé)iOS教學(xué)及管理工作。
浪潮集團(tuán)項(xiàng)目經(jīng)理。精通Java與.NET 技術(shù), 熟練的跨平臺(tái)面向?qū)ο箝_發(fā)經(jīng)驗(yàn),技術(shù)功底深厚。 授課風(fēng)格 授課風(fēng)格清新自然、條理清晰、主次分明、重點(diǎn)難點(diǎn)突出、引人入勝。
精通HTML5和CSS3;Javascript及主流js庫(kù),具有快速界面開發(fā)的能力,對(duì)瀏覽器兼容性、前端性能優(yōu)化等有深入理解。精通網(wǎng)頁(yè)制作和網(wǎng)頁(yè)游戲開發(fā)。
具有10 年的Java 企業(yè)應(yīng)用開發(fā)經(jīng)驗(yàn)。曾經(jīng)歷任德國(guó)Software AG 技術(shù)顧問(wèn),美國(guó)Dachieve 系統(tǒng)架構(gòu)師,美國(guó)AngelEngineers Inc. 系統(tǒng)架構(gòu)師。