业务场景是这样的:老板让我写一个函数,分别取零售店的类目和市场的类目进行比较,看零售店是否有多的类目,然后给这个类目打上标记。
你可以理解为取两张表,A,B,比较A,B,如果A表中的内容B表中找不到就给这个内容打上标记,最后返回A表。
首先是异步取两张表,同时等待两个异步操作,所以我用了一个Promise.all来等待获取两个Promise的返回结果,接着用一个嵌套for循环进行比较。然后觉得这个代码写的也太冗余了。于是决定用点小技巧。
原先选用for循环是方式是防止自己想要break,写完后发现逻辑上都是要比较的,所以不用break,用forEach就没问题了。然后,第二个for循环其实是做一个比较,那么就想到数组的方法Array.some(),有true则true,所有都为false时则为false,正好符合我的业务场景。于是做了以下简化。
最开始写的:
let twoCategories = await Promise.all([this.getRetailCategoryList(),this.getCateTreeByOpenCode()])
let shopCategories = twoCategories[0]
let carrierCategories = twoCategories[1]
for(let i=0;i<shopCategories.length;i++){
let shopCate = shopCategories[i]
let diffLength = 0
for(let j=0;j<carrierCategories.length;j++){
let carrierCate = carrierCategories[j]
if(shopCate.name != carrierCate.name){
diffLength++
}
}
if(diffLength==carrierCategories.length){
shopCate.isOnlyShop = true
}
}
简化后:
let twoCategories = await Promise.all([this.getRetailCategoryList(),this.getCateTreeByOpenCode()]);
let shopCategories = twoCategories[0],carrierCategories = twoCategories[1];
shopCategories.forEach((shopCate)=>{
let isAllDiff = carrierCategories.some((carrierCate)=>carrierCate.name==shopCate.name);
shopCate.isOnlyShop = !isAllDiff;
})