我收到api的回复
columns: Array(4)
0: "Id"
1: "Title"
2: "Description"
3: "IsActive"
,并且我需要将其转换为这种格式,因此将出现“字段”,并且在字段下方列出了api响应的值,并且在每个值上都有一个类型,我需要确定其类型还是ID还是IsActive然后它将是数字。我只允许遵循这种特定的对象格式,而且我需要支持IE浏览器
fields: {
Id: { type: "number" },
Title: { type: "string" },
Description: { type: "string" },
IsActive: { type: "number" }
}
答案 0 :(得分:1)
您需要在某处包括有关数字类型的其他信息。该解决方案将那些存储在一个数组中,将该数组传递到一个函数中,然后返回一个函数,该函数采用一个列数组并返回一个字段定义的对象。
const makeFields = (numericTypes) => (columns) => columns.reduce(
(a, s) => ({...a, [s]: {type: numericTypes.includes(s) ? 'numeric' : 'string'}}),
{}
)
const numericTypes = ['Id', "IsActive"]
const columns = ["Id", "Title", "Description", "IsActive"]
console.log(makeFields(numericTypes)(columns))
您可以将中间函数保存为const makeMyFields = makeFields(numericTypes)
之类,然后再将其用作makeMyFields(columns)
这是另一个应在IE中使用的版本(未经测试):
const makeFields = function(numericTypes) {
return function(columns) {
return columns.reduce(function(a, s) {
a[s] = {type: numericTypes.includes(s) ? 'numeric' : 'string'}
return a
}, {})
}
}
您在运行此代码时遇到问题。我猜您提供的参数不正确。请注意,此版本要求您传递数值列表以返回一个函数,然后使用列列表调用该函数以返回类型的对象。也就是说,您必须这样称呼它:
// makeFields (numericTypes) (columns)
// ^ ^ ^------ call that new function with column names
// | `---- call with list of numeric types, returns a new function
// `-- function name
更改功能非常容易,因此您可以一次性提供所有参数。但是这种表达方式有一个优势。您可以使用数字类型调用外部函数,然后获取可重用的函数。然后可以将该内部函数应用于您选择的任何一组列。可以将其传递给map
,这样,如果您有多组列,则只需编写multipleColumns.map(makeFields(numericTypes))
。
但是,如果要更改它,新版本可能如下所示:
const makeFields = function(numericTypes, columns) {
return columns.reduce(function(a, s) {
a[s] = {type: numericTypes.includes(s) ? 'numeric' : 'string'}
return a
}, {})
}
const numericTypes = ['Id', "IsActive"]
const columns = ["Id", "Title", "Description", "IsActive"]
console.log(makeFields(numericTypes, columns))