js将某对象的key作为label,value作为value,组合成新的结构

本文介绍了后端如何将信息打包成key-value对发送给前端,以及前端通过JavaScript对象方法(如Object.keys()和Object.values())遍历并创建可使用的数组结构的过程。

问题描述

后端有时会将信息的名称和值组合成key、value发送给前端,而前端拿到这样的数据需要处理一下才能使用
处理的方式如下:

let arr = [];
let keys = Object.keys(Obj);
let values = Object.values(Obj);
keys.forEach((v,i)=>{
arr.push({
label:v,
value:values[i]
})
})

class MergeableConfig(TimeModel): label_name = models.CharField(max_length=64, help_text='标签名') label_licensor = models.ForeignKey( User, on_delete=models.PROTECT, related_name='mergeable_configs', related_query_name='mergeable_config', help_text='许可人', ) def __str__(self): return self.label_name class Meta: unique_together = ('label_name', 'label_licensor') class BuildRepo(TimeModel): name = models.CharField(max_length=64, unique=True, help_text='门禁任务所属仓库名称') lgtm_commentators = ArrayField(models.CharField(max_length=64), default=list, help_text='有权限评论lgtm的角色类型') approve_commentators = ArrayField(models.CharField(max_length=64), default=list, help_text='有权限approve的角色类型') committers_num = models.IntegerField(default=-1, help_text='必要的committers数量') reviewers_num = models.IntegerField(default=-1, help_text='reviewers数量') def __str__(self): return self.name class BuildBranchRepo(TimeModel): repo = models.ForeignKey( BuildRepo, on_delete=models.CASCADE, related_name='build_branch_repos', related_query_name='build_branch_repo', help_text='门禁任务所属仓库', ) target_branch = models.CharField(max_length=64, help_text='目标分支') pipline_platform = models.CharField(max_length=64, choices=PipLinePlatform.choices,help_text='流水线平台') mergeable_configs = models.ManyToManyField( MergeableConfig, blank=True, through='RepoMergeableShip', through_fields=('repo', 'mergeable_config'), related_name='mergeable_config_repos', related_query_name='mergeable_config_repo', ) def __str__(self): return f'{self.repo.name}-{self.target_branch}' class Meta: unique_together = ('repo_name', 'target_branch') class RepoMergeableShip(TimeModel): repo = models.ForeignKey( BuildBranchRepo, on_delete=models.CASCADE, related_name='repo_mergeable_ships', related_query_name='repo_mergeable_ship', help_text='门禁任务所属仓库', ) mergeable_config = models.ForeignKey( MergeableConfig, on_delete=models.CASCADE, related_name='repo_mergeable_ships', related_query_name='repo_mergeable_ship', help_text='门禁仓库标签', ) def __str__(self): return f'{self.repo.repo_name}-{self.mergeable_config.label_name}' class Meta: unique_together = ('repo', 'mergeable_config') 基于以上数据结构, 给定全量配置, 录入全量代码仓的可合入标签,给出合理的全量配置数据结构,生成配置同步脚本, 脚本要求使用面向对象,采用类的设计,需要优化查询,批量创建和更新
最新发布
11-18
<template> <table class="data-table"> <!-- 表头行 --> <tr> <th class="label">项目</th> <th v-for="(header, index) in headers" :key="index">{{ header }}</th> </tr> <!-- 普通数据行 --> <tr v-for="(row, rowIndex) in normalRows" :key="rowIndex"> <td class="label">{{ row.label }}</td> <td v-for="(col, colIndex) in row.columns" :key="colIndex"> {{ col.value }} </td> </tr> <!-- "便"行特殊处理 - 拆分成三行 --> <tr v-for="(subRow, subRowIndex) in 3" :key="`special-${subRowIndex}`"> <!-- 第一列标签(只显示在第一行) --> <td v-if="subRowIndex === 0" class="label" :rowspan="3">便</td> <!-- 数据单元格 --> <td v-for="(col, colIndex) in specialRow.columns" :key="`col-${colIndex}`" class="special-cell" > <!-- 使用单行单列网格确保边框对齐 --> <div class="cell-content"> {{ col.values[subRowIndex] }} </div> </td> </tr> </table> </template> <script setup> import { ref, reactive } from 'vue'; // 表头数据 const headers = ref(['周一', '周二', '周三', '周四', '周五']); // 普通行数据 const normalRows = reactive([ { label: '日期', columns: Array(5).fill({ value: '1998-10-30' }) }, { label: '天气', columns: Array(5).fill({ value: '晴' }) }, { label: '气温', columns: Array(5).fill({ value: '38℃' }) } ]); // 特殊行数据 const specialRow = reactive({ label: '便', columns: Array(5).fill({ values: ['1', '2', '3'] // 每个单元格包含3个子值 }) }); // 动态更新示例 setTimeout(() => { // 更新日期行的第二列 normalRows[0].columns[1].value = '2023-07-21'; // 更新便行第三列的值 specialRow.columns[2].values = ['4', '5', '6']; }, 2000); </script> <style scoped> /* 基础表格样式 - 确保边框完美对齐 */ .data-table { width: 100%; border-collapse: collapse; /* 关键:合并边框 */ border-spacing: 0; margin: 20px 0; font-family: Arial, sans-serif; table-layout: fixed; /* 固定布局确保列宽一致 */ } .data-table th, .data-table td { padding: 0; /* 移除内边距,由内部元素控制 */ text-align: center; border: 1px solid #ccc; /* 统一边框样式 */ position: relative; height: 40px; /* 固定行高 */ vertical-align: middle; /* 内容垂直居中 */ } .data-table th { background-color: #f0f0f0; font-weight: bold; padding: 12px 15px; /* 表头保留内边距 */ } .label { background-color: #f5f5f5; width: 15%; font-weight: bold; padding: 12px 15px; /* 标签列保留内边距 */ } /* 特殊单元格样式 */ .special-cell { padding: 0 !important; border-left: 1px solid #ccc; border-right: 1px solid #ccc; } /* 单元格内容容器 */ .cell-content { display: flex; align-items: center; justify-content: center; height: 100%; width: 100%; padding: 10px 0; /* 内部垂直间距 */ box-sizing: border-box; } /* 特殊行的边框处理 */ .data-table tr:last-child td { border-bottom: 1px solid #ccc !important; } /* 确保特殊单元格的边框完美对齐 */ .special-cell:first-child { border-left: none; } .special-cell:last-child { border-right: none; } </style> 便那行改成竖着三行
08-06
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值