JavaScript如何對(duì)比兩個(gè)數(shù)組?數(shù)組B根據(jù)數(shù)組A來(lái)做出增刪? (不用jquery,原生js)
具體問(wèn)題是這樣的:
每次我checkbox勾選后,都會(huì)將所勾選的所有value得到并聲稱(chēng)arryA,如下:
var arrayA = ['a','b','c'];
arryB是用來(lái)渲染一個(gè)表格,一個(gè)obj就是一行。每個(gè)td里的值都是可修改的,也就是說(shuō)每個(gè)num[1-4]都可修改,如下:
var arrayB = [{
key:'a',
num1:'1',
num2:'2',
num3:'3',
tot:'6'
},{
key:'b',
num1:'11',
num2:'22',
num3:'33',
tot:'66'
},{
key: 'c',
num1: '111',
num2: '222',
num3: '333',
tot:666
}];
那么問(wèn)題來(lái)了,每次勾選后,生成arryA的同時(shí)還要將arryB和arryA做對(duì)比,例如我勾選了一個(gè)x:
1、如果arryA中有a,arryB中沒(méi)有,那么在arryB中增加一個(gè)key值為a的boj,且其他屬性值可均為'0';如下: {key:'a',num1:'0',num2:'0',num3:'0',tot':0'}
2、如果arryA中有a,arryB中也有key值為a的obj,那么arryB則不改變,并且該obj里的其他屬性和屬性值均不變;
3、如果取消勾選a,也就是說(shuō)arryA中去掉了a,那么arryB中key值為a的obj整個(gè)刪掉。目的是讓table里的該行刪掉;
求各路大神解答,謝謝啦
一步一步來(lái)吧!
首先,arrayB
的數(shù)組是根據(jù)arrayA
來(lái)的,所以肯定是遍歷arrayA
,然后再根據(jù)arrayA
的元素,在arrayB
中進(jìn)行查找。如果有找到記錄就添加進(jìn)去,沒(méi)有就添加{key:'a',num1:'0',num2:'0',num3:'0',tot':0'}
。下面看代碼
var arrayA = ['b','c'];
var arrayB = [{
key:'a',
num1:'1',
num2:'2',
num3:'3',
tot:'6'
},{
key:'b',
num1:'11',
num2:'22',
num3:'33',
tot:'66'
},{
key: 'c',
num1: '111',
num2: '222',
num3: '333',
tot:666
}];
//準(zhǔn)備臨時(shí)數(shù)組
var result=[],arr;
//遍歷
for(var i=0;i<arrayA.length;i++){
//根據(jù)arrayA[i]的值,查找arrayB,如果arrayB中的有滿足條件(arrayB中的對(duì)象,有key值等于arrayA[i])的項(xiàng),就會(huì)返回滿足條件的項(xiàng),否則返回underfind;
arr=arrayB.find(function(val){return val.key===arrayA[i]});
//如果arr不是undefind,就會(huì)添加arr,否則添加{key:arrayA[i],num1:'0',num2:'0',num3:'0',tot:'0'}。
arr?result.push(arr):result.push({key:arrayA[i],num1:'0',num2:'0',num3:'0',tot:'0'});
}
運(yùn)行一下,結(jié)果正確
但是這樣肯定是不完美的,沒(méi)法復(fù)用。下面用個(gè)方法封裝一下。
function compareArr(arr1,arr2){
//準(zhǔn)備臨時(shí)數(shù)組
var result=[],arr;
//遍歷
for(var i=0;i<arr1.length;i++){
//根據(jù)arrayA[i]的值,查找arrayB,如果arrayB中的有滿足條件(arrayB中的對(duì)象,有key值等于arrayA[i])的項(xiàng),就會(huì)返回滿足條件的項(xiàng),否則返回underfind;
arr=arr2.find(function(val){return val.key===arr1[i]});
//如果arr不是undefind,就會(huì)添加arr,否則添加{key:arrayA[i],num1:'0',num2:'0',num3:'0',tot:'0'}。
arr?result.push(arr):result.push({key:arr1[i],num1:'0',num2:'0',num3:'0',tot:'0'});
}
return result;
}
代碼或許會(huì)覺(jué)得有點(diǎn)不優(yōu)雅,那就用es6優(yōu)雅一點(diǎn),原理是一樣,遍歷arrayA
,根據(jù)arrayA
的天涯不是有查找arrayB
function compareArr(arr1, arr2) {
return arr1.map(item1 => {
//如果arr2.find(item2 => item2.key === item1),有查找到記錄就返回記錄,否則就返回{ key: item1, num1: '0', num2: '0', num3: '0', tot: '0' }
return arr2.find(item2 => item2.key === item1)||{ key: item1, num1: '0', num2: '0', num3: '0', tot: '0' }
})
}
北大青鳥(niǎo)APTECH成立于1999年。依托北京大學(xué)優(yōu)質(zhì)雄厚的教育資源和背景,秉承“教育改變生活”的發(fā)展理念,致力于培養(yǎng)中國(guó)IT技能型緊缺人才,是大數(shù)據(jù)專(zhuān)業(yè)的國(guó)家
北大青鳥(niǎo)中博軟件學(xué)院創(chuàng)立于2003年,作為華東區(qū)著名互聯(lián)網(wǎng)學(xué)院和江蘇省首批服務(wù)外包人才培訓(xùn)基地,中博成功培育了近30000名軟件工程師走向高薪崗位,合作企業(yè)超4
中公教育集團(tuán)創(chuàng)建于1999年,經(jīng)過(guò)二十年潛心發(fā)展,已由一家北大畢業(yè)生自主創(chuàng)業(yè)的信息技術(shù)與教育服務(wù)機(jī)構(gòu),發(fā)展為教育服務(wù)業(yè)的綜合性企業(yè)集團(tuán),成為集合面授教學(xué)培訓(xùn)、網(wǎng)
達(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
曾工作于聯(lián)想擔(dān)任系統(tǒng)開(kāi)發(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ū)ο箝_(kāi)發(fā)經(jīng)驗(yàn),技術(shù)功底深厚。 授課風(fēng)格 授課風(fēng)格清新自然、條理清晰、主次分明、重點(diǎn)難點(diǎn)突出、引人入勝。
精通HTML5和CSS3;Javascript及主流js庫(kù),具有快速界面開(kāi)發(fā)的能力,對(duì)瀏覽器兼容性、前端性能優(yōu)化等有深入理解。精通網(wǎng)頁(yè)制作和網(wǎng)頁(yè)游戲開(kāi)發(fā)。
具有10 年的Java 企業(yè)應(yīng)用開(kāi)發(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)師。