将响应从api转换为具有特定格式的对象

时间:2019-04-29 14:27:17

标签: javascript

我收到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" }
}

1 个答案:

答案 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
    }, {})
  }
}

更新2

您在运行此代码时遇到问题。我猜您提供的参数不正确。请注意,此版本要求您传递数值列表以返回一个函数,然后使用列列表调用该函数以返回类型的对象。也就是说,您必须这样称呼它:

// 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))