本文目录导读:

我来帮你写一个表单数据构造脚本,这里提供几个不同场景下的实现方案:
基础表单数据构造(JavaScript)
// 构造表单数据的工具函数
class FormDataBuilder {
constructor() {
this.formData = {};
this.rules = {};
}
// 添加字段
addField(name, value, options = {}) {
this.formData[name] = value;
if (options.required || options.type) {
this.rules[name] = options;
}
return this;
}
// 批量添加字段
addFields(fields) {
Object.entries(fields).forEach(([key, value]) => {
if (typeof value === 'object' && value.value !== undefined) {
this.addField(key, value.value, value.options || {});
} else {
this.addField(key, value);
}
});
return this;
}
// 构造最终数据
build() {
return {
data: { ...this.formData },
rules: { ...this.rules },
toFormData: () => this.toFormData(),
toJSON: () => JSON.stringify(this.formData),
validate: () => this.validate()
};
}
// 转换为 FormData 对象(用于文件上传等)
toFormData() {
const fd = new FormData();
Object.entries(this.formData).forEach(([key, value]) => {
if (value instanceof File || value instanceof Blob) {
fd.append(key, value, value.name);
} else if (Array.isArray(value)) {
value.forEach((item, index) => {
fd.append(`${key}[${index}]`, item);
});
} else {
fd.append(key, value);
}
});
return fd;
}
// 简单的数据验证
validate() {
const errors = [];
Object.entries(this.rules).forEach(([field, rule]) => {
const value = this.formData[field];
if (rule.required && !value) {
errors.push(`${field} 是必填字段`);
}
if (rule.type === 'email' && value && !/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(value)) {
errors.push(`${field} 格式不正确`);
}
if (rule.type === 'phone' && value && !/^1[3-9]\d{9}$/.test(value)) {
errors.push(`${field} 手机号格式不正确`);
}
if (rule.maxLength && value && value.length > rule.maxLength) {
errors.push(`${field} 长度不能超过 ${rule.maxLength}`);
}
if (rule.minLength && value && value.length < rule.minLength) {
errors.push(`${field} 长度不能少于 ${rule.minLength}`);
}
});
return {
isValid: errors.length === 0,
errors
};
}
}
// 使用示例
const builder = new FormDataBuilder();
// 添加表单字段
builder
.addField('username', '张三', { required: true, minLength: 2, maxLength: 20 })
.addField('email', 'zhangsan@example.com', { required: true, type: 'email' })
.addField('phone', '13800138000', { type: 'phone' })
.addFields({
age: 25,
gender: { value: 'male', options: { required: true } },
avatar: new File([''], 'avatar.jpg', { type: 'image/jpeg' })
});
// 构建数据
const formData = builder.build();
// 获取不同类型的数据
console.log('JSON 数据:', formData.toJSON());
console.log('验证结果:', formData.validate());
// 发送请求
fetch('/api/submit', {
method: 'POST',
body: formData.toFormData() // 支持文件上传
});
动态表单数据构造(支持嵌套)
class AdvancedFormBuilder {
constructor(schema) {
this.schema = schema || {};
this.data = {};
this._initData();
}
_initData() {
// 根据 schema 初始化默认值
Object.entries(this.schema).forEach(([key, config]) => {
this.data[key] = config.default || '';
});
}
// 设置字段值
set(field, value) {
if (field.includes('.')) {
// 支持嵌套路径
const keys = field.split('.');
let current = this.data;
keys.forEach((key, index) => {
if (index === keys.length - 1) {
current[key] = value;
} else {
if (!current[key]) current[key] = {};
current = current[key];
}
});
} else {
this.data[field] = value;
}
return this;
}
// 设置数组字段
setArray(field, items) {
this.data[field] = items;
return this;
}
// 添加数组项
addArrayItem(field, item) {
if (!this.data[field]) {
this.data[field] = [];
}
this.data[field].push(item);
return this;
}
// 生成表单数据
generate() {
return {
data: this.data,
schema: this.schema,
toUrlEncoded: () => this._toUrlEncoded(),
toFormData: () => this._toFormData(),
toXML: () => this._toXML()
};
}
_toUrlEncoded() {
const params = new URLSearchParams();
this._flattenObject(this.data, '', params);
return params.toString();
}
_flattenObject(obj, prefix, params) {
Object.entries(obj).forEach(([key, value]) => {
const fullKey = prefix ? `${prefix}[${key}]` : key;
if (value && typeof value === 'object' && !Array.isArray(value)) {
this._flattenObject(value, fullKey, params);
} else if (Array.isArray(value)) {
value.forEach((item, index) => {
params.append(`${fullKey}[${index}]`, item);
});
} else {
params.append(fullKey, value);
}
});
}
_toFormData() {
const fd = new FormData();
Object.entries(this.data).forEach(([key, value]) => {
if (value instanceof File) {
fd.append(key, value);
} else if (typeof value === 'object') {
fd.append(key, JSON.stringify(value));
} else {
fd.append(key, value);
}
});
return fd;
}
_toXML() {
let xml = '<?xml version="1.0" encoding="UTF-8"?>\n<form>\n';
this._buildXML(this.data, xml, 1);
xml += '</form>';
return xml;
}
_buildXML(obj, xml, indent) {
const space = ' '.repeat(indent);
Object.entries(obj).forEach(([key, value]) => {
if (typeof value === 'object' && !Array.isArray(value)) {
xml += `${space}<${key}>\n`;
this._buildXML(value, xml, indent + 1);
xml += `${space}</${key}>\n`;
} else {
xml += `${space}<${key}>${value}</${key}>\n`;
}
});
return xml;
}
}
// 使用示例
const builder = new AdvancedFormBuilder({
name: { required: true, maxLength: 50 },
contact: {
email: { type: 'email' },
phone: { type: 'phone' }
},
tags: { type: 'array' }
});
builder
.set('name', '测试用户')
.set('contact.email', 'test@example.com')
.setArray('tags', ['tag1', 'tag2'])
.addArrayItem('tags', 'tag3');
const formData = builder.generate();
console.log('URL 编码:', formData.toUrlEncoded());
console.log('原始数据:', formData.data);
测试用表单数据生成器
class TestFormDataGenerator {
constructor() {
this.fieldGenerators = {
string: (options = {}) => {
const chars = 'abcdefghijklmnopqrstuvwxyz';
const length = options.length || 10;
return Array.from({ length }, () => chars[Math.floor(Math.random() * chars.length)]).join('');
},
number: (options = {}) => {
const min = options.min || 0;
const max = options.max || 9999;
return Math.floor(Math.random() * (max - min + 1)) + min;
},
email: () => `${this.fieldGenerators.string({ length: 8 })}@${this.fieldGenerators.string({ length: 5 })}.com`,
phone: () => `1${Array.from({ length: 10 }, () => Math.floor(Math.random() * 10)).join('')}`,
date: (options = {}) => {
const start = options.startDate || '2020-01-01';
const end = options.endDate || '2024-12-31';
const startMs = new Date(start).getTime();
const endMs = new Date(end).getTime();
return new Date(startMs + Math.random() * (endMs - startMs)).toISOString().split('T')[0];
},
boolean: () => Math.random() > 0.5,
file: () => new File(['test content'], `test_${Date.now()}.txt`, { type: 'text/plain' })
};
}
// 根据 schema 生成随机表单数据
generateFromSchema(schema) {
const data = {};
Object.entries(schema).forEach(([field, config]) => {
if (config.type === 'group') {
data[field] = this.generateFromSchema(config.fields);
} else if (config.type === 'array') {
data[field] = Array.from(
{ length: config.count || 3 },
() => this.generateFromSchema(config.itemSchema || {})
);
} else {
const generator = this.fieldGenerators[config.type];
if (generator) {
data[field] = generator(config.options || {});
}
}
});
return data;
}
// 生成多个测试用例
generateTestCases(schema, count = 5) {
return Array.from({ length: count }, (_, index) => ({
case: index + 1,
data: this.generateFromSchema(schema),
timestamp: new Date().toISOString()
}));
}
}
// 使用示例
const generator = new TestFormDataGenerator();
const schema = {
username: { type: 'string', options: { length: 8 } },
age: { type: 'number', options: { min: 18, max: 65 } },
email: { type: 'email' },
phone: { type: 'phone' },
birthDate: { type: 'date' },
isActive: { type: 'boolean' },
avatar: { type: 'file' },
address: {
type: 'group',
fields: {
street: { type: 'string', options: { length: 20 } },
city: { type: 'string', options: { length: 10 } }
}
},
tags: {
type: 'array',
count: 3,
itemSchema: {
name: { type: 'string', options: { length: 5 } }
}
}
};
const testCases = generator.generateTestCases(schema, 3);
console.log('测试用例:', JSON.stringify(testCases, null, 2));
使用建议
- 基础场景:使用第一个简单的
FormDataBuilder - 复杂嵌套:使用
AdvancedFormBuilder - 测试目的:使用
TestFormDataGenerator
这些脚本可以直接在浏览器或 Node.js 环境中使用,支持:
- 字段验证
- 多种输出格式(JSON、FormData、URL编码、XML)
- 文件上传支持
- 随机测试数据生成
- 链式调用
根据你的具体需求选择合适的实现方式。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播