2 回答

TA貢獻(xiàn)1839條經(jīng)驗(yàn) 獲得超15個(gè)贊
先說一下原來的代碼。
做一個(gè)雙循環(huán)也并不需要用到遞歸,找到重復(fù)項(xiàng)原地踏步就行!
直接操作外部變量也不是一個(gè)好的選擇!
if (arr[i] == repeatArr[j]) {
arr.splice(i, 1);
i--
break;
}
另外,
去重最常用的像上面說的,使用哈希,就不累贅了哈!
其實(shí)你可以從幾個(gè)方面考慮一下上面幾種答案。
1、是否純函數(shù)或者說是否直接修改外部變量
2、性能、復(fù)雜度
3、代碼可讀性(這個(gè)不說了,大家都有自己的見解)
arr.filter(item => !repeatArr.includes(item))
function fp(origin, repeat) {
return origin.filter(item => !repeat.includes(item))
}
第一種偏函數(shù)式,不影響外部,可以很輕松封裝成函數(shù),也方便復(fù)用!
復(fù)雜度也是O(n^2),上用大白話說,其實(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ù)訪問的時(shí)候比遍歷要快,在處理的量大的情況下,性能優(yōu)于第一種方法
剛剛還看到了第三種使用正則的。
還挺復(fù)雜的,最后數(shù)據(jù)類型也發(fā)生變化了。
沒有嘗試哈!
最后說一下你改以后的方法哈
for (var i = 0; i < repeatArr.length;i++) {
var index = arr.indexOf(repeatArr[i]);
arr.splice(index, 1);
}
就像yszou說的你的復(fù)雜度上沒有優(yōu)勢(shì)!
而且使用了splice方法,直接修改了原始數(shù)組不說,且這個(gè)方法本身就比較消耗性能的。
用大白話說,splice在刪除那一項(xiàng)以后,得把該項(xiàng)以后的每一項(xiàng)都前移一位!
可讀性上面我就不評(píng)論了哈·~~~
添加回答
舉報(bào)