我有一些值的数组:
let typeArray = ["name", "strret", "car", "type"];
我有一个对象:
let formDefinitionObject = {schema:{}}
我希望formDefinitionObject
对象像:
let formDefinitionObject = {
schema: {
name: {
type: 'string',
title: 'Name',
required: true
},
strret: {
type: 'string',
title: 'Strret'
},
car: {
type: 'string',
title: 'Car'
},
type: {
type: 'string',
title: 'Type'
}
}
}
我希望动态地使数组中的每个项目成为formDefinitionObject.schema
对象中的对象。例如,如果我在数组typeArray.push('country')
中添加一个项目,以自动在formDefinitionObject.schema对象中添加此对象。
答案 0 :(得分:1)
无法理解required: true
的位置。剩余的操作可以按如下操作
var getFormDefinition = function(arr) {
function getSchemaObj(arr) {
return arr.map(d => ({
[d]: {
type: typeof(d),
title: d
}
}))
.reduce((a, b) => ({ ...a, ...b }))
}
var schemaObj = getSchemaObj(arr)
arr.push = function(...d) {
Object.assign(schemaObj, getSchemaObj(d))
return Array.prototype.push.call(arr, ...d)
}
return ({
schema: schemaObj
})
}
var typeArray = ["name", "strret", "car", "type"];
var result = getFormDefinition(typeArray)
console.log(result)
typeArray.push('nitish')
console.log(result)
答案 1 :(得分:0)
您可以将Proxy
上的typeArray
与set
陷阱一起使用,因此每次将新值推送到代理数组时,也可以向架构中添加新属性。这样,您可以模拟观察者模式。
您还可以创建一些模式来添加其他属性,例如required
,例如name:prop1:prop2
,但是这种方式将值固定为true
。
let typeArray = ["name:required", "strret", "car", "type"];
let formDefinitionObject = {
schema: {}
}
let proxyArray = new Proxy(typeArray, {
set(obj, prop, value) {
if (prop != 'length') addToSchema(formDefinitionObject.schema, value);
return Reflect.set(...arguments);
}
})
function capitalize(string) {
return string.charAt(0).toUpperCase() + string.slice(1);
}
function addToSchema(schema, prop) {
const [name, ...params] = prop.split(':');
schema[name] = {
type: 'string',
title: capitalize(name)
}
params.forEach(param => schema[name][param] = true);
return schema;
}
proxyArray.reduce(addToSchema, formDefinitionObject.schema);
proxyArray.push('email:required:isEmail');
proxyArray.push('phone');
console.log(formDefinitionObject)
更新:您可以使用类似name:prop1|value:prop2
的属性添加true
以外的属性值,但是如果您未指定值,则默认值仍为true
let typeArray = ["name:required", "strret", "car", "type"];
let formDefinitionObject = {
schema: {}
}
let proxyArray = new Proxy(typeArray, {
set(obj, prop, value) {
if (prop != 'length') addToSchema(formDefinitionObject.schema, value);
return Reflect.set(...arguments);
}
})
function capitalize(string) {
return string.charAt(0).toUpperCase() + string.slice(1);
}
function addToSchema(schema, prop) {
const [name, ...params] = prop.split(':');
schema[name] = {
type: 'string',
title: capitalize(name)
}
params.forEach(param => {
const [key, value] = param.split('|');
schema[name][key] = value ? value : true
});
return schema;
}
proxyArray.reduce(addToSchema, formDefinitionObject.schema);
proxyArray.push('email:required:isEmail');
proxyArray.push('phone:default|123/555-333:required');
proxyArray.push('address')
console.log(formDefinitionObject)
答案 2 :(得分:0)
即使您没有进一步说明字段必须为(\w+)\s\[[^]]*]
还是任何字段都必须为required
的情况,但这还是基于您到目前为止提供的解决方案。
下一个代码片段完成了工作,并且有一些解释:
string
如果您在评论部分回答我们的问题,我会在这里。
然后,希望我能进一步推动您前进。