javascript數(shù)組減去另一數(shù)組

title

做聊天項目的時候遇要實現(xiàn)這樣的一個功能: 邀請新的好友入群;點擊邀請好友會彈出一個好友列表,顯示你除了在群里面的好友外剩下的所有好友;
我的思路是取到你所有的好友,然后所有好友中過濾掉已經(jīng)是群成員的好友

const users = [
    {
        _id: 1,
        name: '好友1'
    },
    {
        _id: 2,
        name: '好友1'
    },
    {
        _id: 3,
        name: '好友1'
    },
];
const groupMembers = [
    {
        _id: 1,
        name: '好友1'
    },
    {
        _id: 2,
        name: '好友1'
    },
]

現(xiàn)在一步一步來看數(shù)組的操作

一,兩個數(shù)組里的每一項分別為元素時

const arr1 = ['', '100', '120', '125', '125', '130', '130'];

const arr2 = ['', '120', '125', '125', '130'];

請問如何求得兩個數(shù)組之差?使得新數(shù)組為 arr3 = ['100','130']

方法一:

思路:用for循環(huán)比較arr1和arr2的每一項,如果相等,就刪除

const arr1 = ['', '120', '125', '125', '130', '130', '130', '130', '130'];

const arr2 = ['', '120', '125', '130'];

for (let i = arr1.length - 1; i >= 0; i--) {
    a = arr1[i];
    for (let j = arr2.length - 1; j >= 0; j--) {
        b = arr2[j];
        if (a == b) {
            arr1.splice(i, 1);
            arr2.splice(j, 1);
            break;
        }
    }
}

console.log(arr1);  // ['125','130','130','130','130']

方法二:

思路:將第一個數(shù)組存入一個對象尔破,這樣就已經(jīng)去重了懒构;再把第二個數(shù)組中的元素當作key從對象中刪除耘擂。

const m = {};
arr1.forEach(function(al){m[al]=al;})
arr2.forEach(function(bl){delete m[bl];})
console.dir(Object.keys(m))

方法三:

思路:聲明一個新的數(shù)組arr3,比較arr1和arr2,如果arr1中有和arr2不相等的就放入arr3中,用到了es6中關于數(shù)組的新方法findIndex(),稍后會詳細的介紹;

const arr1 = ['', '100', '120', '125', '125', '130', '130'];
const arr2 = ['', '120', '125', '125', '130'];
const arr3 = [];
arr1.forEach((a)=>{
    let c = arr2.findIndex(b =>a === b);
    if (c > -1) delete arr2[c];
    else arr3.push(a);
});
console.log(arr3)  //['100', '130']

二, arr1中的每一項都是對象,arr2中的每一項都是元素

const a = [{ id: 15 }, { id: -1 }, { id: 0 }, { id: 3 }, { id: 12.2 }];
const b = [15, 3];

方法一

a.filter(item => { return !b.includes(item.id); });
或
a.filter(item => { return b.indexOf(item.id) === -1; });
 

方法二:

a=a.filter((x)=>b.every((y)=>y!=x.id))

方法三:

const a = [{ id: 15 }, { id: -1 }, { id: 0 }, { id: 3 }, { id: 12.2 }];
const b = [15, 3];
for(index in a){
    if(b.indexOf(a[index]['id'])>=0)
        a.splice(index,1);
}
console.log(a);
或
const result = a.filter(function (item) {
    return b.indexOf(item.id) < 0;
 })

三,arr1中的每一項都是對象,arr2中的每一項也都是對象,現(xiàn)在回到主題

const a = [
    {_id: 1},
    {_id: 2},
    {_id: 3},
];
const b = [
    {_id: 2},
    {_id: 4},
]

解決方法一:

const c = a.filter(x => !b.find(y => y._id === x._id)); // [ { _id: 1 }, { _id: 3} ]

解決方法二:

const c = a.filter(x => b.every(y => y._id !== x._id));

四,介紹一下上面用到的數(shù)組實例中的find(), findIndex(), includes()

find()

find()用于找出第一個符合條件的數(shù)組成員,它的參數(shù)是一個回調函數(shù),所有的數(shù)組成員依次執(zhí)行該回調函數(shù),直到找到第一個返回值為true的成員,然后返回該成員,如果沒有的話,返回undefined

[0, 4, -5, -10].find((n) => n < 0);
// -5

上面代碼找出數(shù)組中第一個小于0的成員

[1, 5, 10, 15].find(function(value, index, arr) {
  return value > 9;
}) 
// 10

find方法的回調函數(shù)可以接受三個參數(shù),當前的值,當前的位置和原數(shù)組

findIndex()

findIndex()方法的用法與find()方法類似,返回第一個符合條件的數(shù)組成員的位置,如果所有成員都不符合,則返回-1.

[1, 5, 10, 15].findIndex(function(value, index, arr) {
  return value > 9;
}) 
// 2

兩個方法都可以發(fā)現(xiàn)NAN,彌補了數(shù)組的indexOf方法的不足

[NaN].indexOf(NaN)
// -1

[NaN].findIndex(y => Object.is(NaN, y))
// 0

indexOf方法無法識別數(shù)組的NaN成員,但是findIndex方法可以借助Object.is方法做到

includes()

Array.prototype.includes方法返回一個布爾值,表達某個數(shù)組是否包含給定的值,與字符串的includes方法類似

[1, 2, 3].includes(2)     // true
[1, 2, 3].includes(4)     // false
[1, 2, NaN].includes(NaN) // true

該方法的第二個參數(shù)表示搜索的起始位置,默認為0,如果第二個參數(shù)為負數(shù),表示倒數(shù)的位置;如果這是它大于數(shù)組長度(比如第二個參數(shù)為-4.但是數(shù)組長度為3),則會重置為從0開始

[1, 2, 3].includes(3, 3);  // false
[1, 2, 3].includes(3, -1); // true

沒有該方法之前,我們通常使用數(shù)組的indexOf方法,檢查是否包含某個值

if (arr.indexOf(el) !== -1) {
  // ...
}

indexOf方法有兩個缺點,一是不夠語義化.它的含義是找到參數(shù)值的第一個出現(xiàn)位置.所以要去比較是否不等于-1,而是,它內部使用嚴格相等運算符(===)進行判斷,這會導致對NaN的誤判

[NaN].indexOf(NaN)
// -1

includes使用的是不一樣的判斷算法秩霍,就沒有這個問題蚁阳。

[NaN].includes(NaN)
// true

參考

github
blog

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市椿疗,隨后出現(xiàn)的幾起案子糠悼,更是在濱河造成了極大的恐慌,老刑警劉巖倔喂,帶你破解...
    沈念sama閱讀 217,734評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異班缰,居然都是意外死亡,警方通過查閱死者的電腦和手機脾拆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評論 3 394
  • 文/潘曉璐 我一進店門莹妒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人渠驼,你說我怎么就攤上這事鉴腻。” “怎么了爽哎?”我有些...
    開封第一講書人閱讀 164,133評論 0 354
  • 文/不壞的土叔 我叫張陵倦青,是天一觀的道長。 經(jīng)常有香客問我产镐,道長踢步,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,532評論 1 293
  • 正文 為了忘掉前任述雾,我火速辦了婚禮兼丰,結果婚禮上,老公的妹妹穿的比我還像新娘黍翎。我一直安慰自己艳丛,他們只是感情好趟紊,可當我...
    茶點故事閱讀 67,585評論 6 392
  • 文/花漫 我一把揭開白布碰酝。 她就那樣靜靜地躺著,像睡著了一般铛嘱。 火紅的嫁衣襯著肌膚如雪袭厂。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,462評論 1 302
  • 那天肛真,我揣著相機與錄音爽航,去河邊找鬼。 笑死讥珍,一個胖子當著我的面吹牛,可吹牛的內容都是我干的趟卸。 我是一名探鬼主播氏义,決...
    沈念sama閱讀 40,262評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼邻邮!你這毒婦竟也來了克婶?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,153評論 0 276
  • 序言:老撾萬榮一對情侶失蹤鸭蛙,失蹤者是張志新(化名)和其女友劉穎筋岛,沒想到半個月后娶视,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體泉蝌,經(jīng)...
    沈念sama閱讀 45,587評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,792評論 3 336
  • 正文 我和宋清朗相戀三年硫兰,在試婚紗的時候發(fā)現(xiàn)自己被綠了寒锚。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,919評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡泳赋,死狀恐怖喇喉,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情拣技,我是刑警寧澤,帶...
    沈念sama閱讀 35,635評論 5 345
  • 正文 年R本政府宣布徐绑,位于F島的核電站莫辨,受9級特大地震影響,放射性物質發(fā)生泄漏沮榜。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,237評論 3 329
  • 文/蒙蒙 一较曼、第九天 我趴在偏房一處隱蔽的房頂上張望振愿。 院中可真熱鬧弛饭,春花似錦、人聲如沸侣颂。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽嘹屯。三九已至,卻和暖如春州弟,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背婆翔。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評論 1 269
  • 我被黑心中介騙來泰國打工啃奴, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人最蕾。 一個月前我還...
    沈念sama閱讀 48,048評論 3 370
  • 正文 我出身青樓揖膜,卻偏偏與公主長得像誓沸,于是被迫代替她去往敵國和親壹粟。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,864評論 2 354

推薦閱讀更多精彩內容

  • 此文章用于歸納Array的所有方法 在JavaScript中洪添,除了Object雀费,用得最多的可能就是數(shù)組Array了...
    moonburn閱讀 281評論 1 3
  • 1.Array.from Array.from方法用于將兩類對象轉為真正的數(shù)組:類似數(shù)組的對象(array-lik...
    趙然228閱讀 665評論 0 0
  • 由于最近都在freecodecamp上刷代碼盏袄,運用了很多JavaScript數(shù)組的方法,因此做了一份關于JavaS...
    2bc5f46e925b閱讀 1,976評論 0 16
  • 擴展運算符(spread)是三個點(...) 它好比 rest 參數(shù)的逆運算逛尚,將一個數(shù)組轉為用逗號分隔的參數(shù)序列刁愿。...
    keknei閱讀 314評論 0 0
  • 部分列子引用的阮一峰ES6教程中的例子 這篇文章主要是自己經(jīng)常用得一些方法總結, 想全篇學習es6, 可以看阮一峰...
    有情懷的程序猿閱讀 591評論 0 1