在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問(wèn)答/HTML/ 從數(shù)組arr中去掉repeatArr,我能想到的最好的方法是遞歸,有沒(méi)有比較簡(jiǎn)潔

從數(shù)組arr中去掉repeatArr,我能想到的最好的方法是遞歸,有沒(méi)有比較簡(jiǎn)潔的方法?

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)
回答
編輯回答
陌離殤
  1. 先把“去重”的概念說(shuō)清楚吧。
  2. 去重這種,O(n) 的時(shí)間復(fù)雜度就夠了。
2018年2月22日 00:46
編輯回答
溫衫

arr.filter((val,key,arr) => arr.indexOf(val) === key))

2018年8月29日 14:53
編輯回答
吢丕

arr.filter(item => !repeatArr .includes(item))

2018年3月3日 05:14
編輯回答
乖乖噠

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);

2018年7月8日 17:18
編輯回答
薄荷糖

先說(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)論了哈·~~~

2017年3月4日 16:52
編輯回答
慢半拍

結(jié)合各位的意見,我用一個(gè)循環(huán)解決了。麻煩各位幫忙看看。

for (var i = 0; i < repeatArr.length;i++) {
    var index = arr.indexOf(repeatArr[i]);
    arr.splice(index, 1);
}
2017年7月25日 19:38
編輯回答
挽青絲

這種要考慮的很多 比如arr是否允許重復(fù)元素能否先優(yōu)化arr數(shù)組 如果都是number 在數(shù)據(jù)量大的時(shí)候是可以先進(jìn)行排序的
repeatArr一定是不能存在重復(fù)元素的
然后不要修改元素組 而是創(chuàng)建新的數(shù)組 這樣一次就可以篩選出
而不是distinct那樣 會(huì)導(dǎo)致多次遍歷了起始已遍歷的數(shù)據(jù)

2018年1月3日 20:05