You need to enable JavaScript to run this app. Vue.js中如何对比两个数组对象并为第一个数组填充数据
优惠活动
大模型
产品
解决方案
定价
更多

Vue.js中如何对比两个数组对象并为第一个数组填充数据

实现方案

核心思路是通过合并默认权限与用户权限生成动态渲染的数据源,完全不需要硬编码适配新增权限,具体实现步骤如下:


1. 实现逻辑说明

首先将userPermissions转换为以permission_name为键的映射表,实现权限项的O(1)快速匹配;再遍历全量默认权限defaultPermissions,自动合并对应用户的权限值,无匹配时保留默认未授权(值为0)的状态。后续新增权限仅需在defaultPermissions中添加配置即可,无需修改其他逻辑。


2. 代码示例

JS逻辑(以Vue为例)

如果仅需权限展示,用计算属性实现即可:

computed: {
  // 合并后的最终权限渲染列表
  mergedPermissions() {
    // 构造用户权限映射表
    const userPermMap = new Map(this.userPermissions.map(item => [item.permission_name, item]))
    // 合并默认权限和用户权限
    return this.defaultPermissions.map(defaultItem => {
      const userPerm = userPermMap.get(defaultItem.permission_name)
      return userPerm ? { ...defaultItem, ...userPerm } : { ...defaultItem }
    })
  }
}

如果需要支持权限编辑后提交,可将合并逻辑改为初始化时赋值给响应式变量:

data() {
  return {
    mergedPermissions: []
  }
},
methods: {
  initPermList() {
    const userPermMap = new Map(this.userPermissions.map(item => [item.permission_name, item]))
    this.mergedPermissions = this.defaultPermissions.map(defaultItem => {
      const userPerm = userPermMap.get(defaultItem.permission_name)
      return userPerm ? { ...defaultItem, ...userPerm } : { ...defaultItem }
    })
  }
},
// 接口获取到两个权限数组后调用初始化方法
created() {
  this.initPermList()
}
模板调整

把表格遍历的数据源替换为合并后的权限列表,同时修正原模板中字段名的笔误(resourceName改为permission_name):

<tr v-for="(item,index) in mergedPermissions" :key="`perm_${index}`">
    <td> {{ item.permission_name }}</td>
    <td> <input type="checkbox" v-model="item.read" class="form-control"/></td>
    <td> <input type="checkbox" v-model="item.write" class="form-control"/></td>
    <td> <input type="checkbox" v-model="item.update" class="form-control"/></td>
    <td> <input type="checkbox" v-model="item.delete" class="form-control"/></td>
</tr>

内容的提问来源于stack exchange,提问作者Anji

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.19 20:06:01