arrays - 打字稿:创建具有嵌套级别,键和值作为变量的对象
问题描述
我的反应表单的每个字段组件都有一个对象数组,我想用我的表单值编译成一个对象。
interface FormProps {
name: string;
subName?: string;
value: undefined | string | number | boolean;
}
interface DatasProps {
user: ProfileProps;
friend: undefined | ProfileProps;
phone: undefined | number;
car: boolean;
}
interface ProfileProps {
firstname: string;
age: undefined | number;
gender: 'male' | 'female';
}
const getDatas = (form: FormProps[]) => {
const datas = {};
// for (const elem of form) {
// }
return datas as DatasProps;
};
const form: FormProps[] = [
{
name: 'user',
subName: 'firstname',
value: 'Marc',
},
{
name: 'user',
subName: 'age',
value: 32,
},
{
name: 'user',
subName: 'gender',
value: 'male',
},
{
name: 'friend',
subName: 'firstname',
value: 'Frank',
},
{
name: 'friend',
subName: 'gender',
value: 'male',
},
{
name: 'car',
value: false,
},
];
console.log(getDatas(form));
这里的预期结果,对于getDatas(form)
:
{
user: {
firstname: 'Marc',
age: 32,
gender: 'male'
},
friend: {
firstname: 'Frank',
gender: 'male'
},
phone: undefined,
car: false
}
我需要自动化这个,因为DatasProps
和FormProps
(ProfileProps
取决于FormProps
)可以改变。
我希望能够应用于getDatas
任何具有一级嵌套的表单,如我们在中所见FormProps
:
name
在key
循环中:array[key]
subName
作为subKey
:array[key][subKey]
解决方案
你需要像这样减少你的数组:
const getDatas = (form: FormProps[]): DatasProps=> {
const datas = form.reduce((acc, field) => {
if (!field.subName) {
datas[field.name] = field.value
continue;
}
if (!acc[field.name]) {
acc[field.name] = {}
}
acc[field.name][field.subName] = field.value
return acc
}, {})
return datas as DatasProps
};
或使用 for 循环:
const getDatas = (form: FormProps[]): DatasProps=> {
const datas = {};
for (const field of form) {
if (!field.subName) {
datas[field.name] = field.value
continue;
}
if (!datas[field.name]) {
datas[field.name] = {}
}
datas[field.name][field.subName] = field.value
}
return datas as DatasProps
};
推荐阅读
- sql - SQL 文本匹配
- ios - 进入/退出地理围栏时,我可以在 iOS 后台设置 Firebase 用户属性吗?
- javascript - 类型错误:react__WEBPACK_IMPORTED_MODULE_0___default(...) 不是函数
- android - 如何在 MaterialDatePicker 中禁用过去的日期?
- node.js - 将nodejs项目从一台PC移动到另一台
- sql - 用于排除一个或多个字符的 MSSQL 通配符
- android - Android Room 数据库总是抛出错误
- c# - 需要至少两个要求的密码的正则表达式
- python-3.x - 有没有更快的方法来读取、使用和转换二进制文件?
- mysql - mysql查询过滤掉NULL或空白行