js 算法问题

有两个数组

    formThead: [
                {
                    label:'机会名称',
                    value:'oppoProjectName',
                    isShow:true
                },
                {
                    label:'客户名称',
                    value:'customerName',
                    isShow:true
                },
                {
                    label:'销售',
                    value:'saleName',
                    isShow:true
                }
            ]
            
            formTheadData:['oppoProjectName','customerName']
            
            如果在formThead中任何一位的value都不在formTheadData中   就把对用的formThead中的isShow变成false
            
            
阅读 3.6k
6 个回答
formThead.forEach((item) => {
  item.isShow = formTheadData.includes(item.value);
});

更新 2

在评论中与 @SlimBear 讨论后,发现解法上可以优化一下:

let hash = formTheadData.reduce((p, c) => [p[c] = 0, p][1], {});

// 得到 hash
// {
//     oppoProjectName: 0,
//     customerName: 0
// }
formThead.forEach((item) => {
    // 不使用 includes 来检索数据
    //  item.isShow = formTheadData.includes(item.value);
    item.isShow = !!hash[item.value]
});

这样就可以避免循环嵌套,性能可以有大幅提升。


更新

经评论 @SlimBear 提醒,filter 是会返回一个新数组的,因此这个解法很有问题。

非常抱歉,由于不是专职前端,这些细节容易忽略,误导题主和各位了。

正解可以看 @原罪 的答案。


原答案:

formThead.filter(h => formTheadData.indexOf(h.value) === -1).forEach(h => h.isShow = false)

var formThead= [
                {
                    label:'机会名称',
                    value:'oppoProjectName',
                    isShow:true
                },
                {
                    label:'客户名称',
                    value:'customerName',
                    isShow:true
                },
                {
                    label:'销售',
                    value:'saleName',
                    isShow:true
                }
            ]
            
            formTheadData=['oppoProjectName','customerName']
            
            for(var i=0;i<formThead.length;i++){
                for(var j=0;j<formTheadData.length;j++){
                    if(formThead[i].value==formTheadData[j]){
                        formThead[i].isShow=true
                    }else{
                        formThead[i].isShow=false
                    }
                }
            }
formThead.map((item) => {
    item.isShow = false;
    formTheadData.some((el,index) => {
        if(item.value == el){
            item.isShow = true;
            formTheadData.splice(index,1);
            return true;
        }
    })
})

“如果在formThead中任何一位的value都不在formTheadData中 就把对用的formThead中的isShow变成false”


@李坦 楼主你能先解释下你这句话的意思吗?只从字面理解的话,只要formThead中的所有item的value都不在formTheadData中的话,就把formThead中所有的item的value变成false。但是貌似你又想表达formThead如果有item的value不存在formTheadData中的就把它的isShow置为false。我感觉 @大胡子先生 的答案受了误导。

谢谢大家哈~ 问题@原罪已帮助完美解决~

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题