【问题标题】:How to generate array of object from object如何从对象生成对象数组
【发布时间】:2022-02-21 10:36:29
【问题描述】:

我有一个这样的对象:

{
   name: 'ABC',
   age: 12,
   timing: '2021-12-30T11:12:34.033Z'
}

我想像这样制作上述对象的每个键的对象数组:

[
   {
      fieldName: 'name',
      dataType: 'string'
   },
   {
      fieldName: 'age',
      dataType: 'number'
   },
   {
      fieldName: 'timing',
      dataType: 'date'
   }
]

我试过了:

let op = Object.entries(data).map(([key, value]) => ({
            fieldName: key,
            dataType: typeof value
        }));

但获取 dataType: 'object' for date 列 但无法实现。有什么解决办法吗? 提前致谢。

【问题讨论】:

  • @evolutionxbox 是的,它正在使用它。但无法对 dataType 键执行此操作,因为它不适用于日期类型
  • 像这样声明你的对象{ fieldName: key, dataType: typeof value}
  • @SaschaLeh 我做了同样的事情,但我得到的结果是日期列的“对象”
  • 我也急于结束这个问题,我投票决定重新打开引用 OP 的最后评论。有一种特殊情况,如果属性的值是有效的时间戳,则必须使用字符串 date

标签: javascript reactjs angular typescript


【解决方案1】:

您可以使用Object.keys()Array.prototype.map()

const ip = {
  name: 'ABC',
  age: 12,
  timing: '2021-12-30T11:12:34.033Z'
};

const op = Object.keys(ip).map((key) => ({
  fieldName: key,
  dataType: typeof ip[key] === 'string' && !isNaN(Date.parse(ip[key])) ? 'date' : typeof ip[key]
}));

console.log(op);

【讨论】:

    【解决方案2】:

    您可以使用日期解析来检查日期是否有效。

    const input = {
      name: 'ABC',
      age: 12,
      timing: '2021-12-30T11:12:34.033Z'
    };
    
    const output = Object.entries(input).map(([key, value]) => ({
      fieldName: key,
      dataType: typeof value === 'string' && !isNaN(Date.parse(value)) ?  'date':typeof value
    }));
    
    console.log(output);

    【讨论】:

    • fieldName 应该是对象键,而不是值;(
    【解决方案3】:

    您可以使用Object#entriesArray#maptypeof 来获取值的类型。对于必须使用'date' 作为有效时间戳的情况,您可以使用Date.parse() 方法和Number#isNaN

    试试下面的

    const input = {
      name: 'ABC',
      age: 12,
      timing: '2021-12-30T11:12:34.033Z'
    };
    
    const output = Object.entries(input).map(([key, value]) => ({
      fieldName: key,
      dataType: typeof value !== 'string' || isNaN(Date.parse(value)) ? typeof value : 'date'
    }));
    
    console.log(output);
    .as-console-wrapper { max-height: 100% !important; top: 0; }

    编辑:将Object#values 替换为Object#entries

    编辑 2:为 dataType 条件添加 typeof value !== 'string'。借自@RahulSharma 的answer

    【讨论】:

    • 出现错误:“未知”类型的参数不可分配给“字符串”类型的参数
    • @techguy:用你的尝试更新问题。显然你使用的类型有错误。
    • 更新了问题
    • 现在它不适用于数字,它也显示数字列的“日期”
    • 对于年龄列也显示“日期”
    【解决方案4】:

    您的解决方案看起来不错,您只需区分普通的string 和有效的date 字符串。

    为此,我建议使用dayjs 包。

    import dayjs from "dayjs";
    
    const input = {
      name: "ABC",
      age: 12,
      timing: "2021-12-30T11:12:34.033Z"
    };
    
    const output = Object.entries(input).map(([key, value]) => {
      return {
        fieldName: key,
        dataType:
          typeof value === "string"
            ? dayjs(value).isValid()
              ? "date"
              : "string"
            : typeof value
      };
    });
    
    console.log("output", output);
    

    CodeSandbox

    如果您想重新发明轮子并自己编写日期检查功能,请查看here 以获得一些建议。

    【讨论】:

      【解决方案5】:
      Object.entries(a).map(([key, value]) => (
      {
          fieldName: key,
          dataType: isNaN(value) && !isNaN(Date.parse(value)) ? 'date' : typeof(value) 
      }))
      

      但请注意这一点,因为它将在 2 月返回无效日期,rg: 2013-02-31

      通过日期检查,您可能应该使用一些库,例如 Momentjs、. .

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-05-21
        • 1970-01-01
        • 1970-01-01
        • 2016-02-27
        • 1970-01-01
        相关资源
        最近更新 更多