【问题标题】:Javascript - modify date objects in an arrayJavascript - 修改数组中的日期对象
【发布时间】:2021-08-14 19:34:54
【问题描述】:

我从 MongoDB Api 收到一个带有一些预期结果的数组:

[
{
    "_id": {
        "$oid": "6108f221faf75fa7899e476c"
    },
    "id": {
        "$numberInt": "7"
    },
    "item1": "XX",
    "item2": "YY",
    "item3": "ZZ",
    "itemdate1": {
        "$date": {
            "$numberLong": "1627976225150"
        }
    },
    "itemdate2": {
        "$date": {
            "$numberLong": "1627976225150"
        }
    },
    
    "itemdate5": {
        "$date": {
            "$numberLong": "1627976225150"
        }
    },
    "itemdate4": {
        "$date": {
            "$numberLong": "1627976225150"
        }
    },
   },
{
    "_id": {
        "$oid": "6108f2219d0f3c7c8b188607"
    },
    "id": {
        "$numberInt": "11"
    },
    "item1": "AA",
    "item2": "BB",
    "item3": "CC",
    "itemdate1": {
        "$date": {
            "$numberLong": "1627976225150"
        }
    },
    "itemdate2": {
        "$date": {
            "$numberLong": "1627976225150"
        }
    },
    
    "itemdat3": {
        "$date": {
            "$numberLong": "1627976225150"
        }
    },
    "itemdate4": {
        "$date": {
            "$numberLong": "1627976225150"
        }
    },
   }

]

这只是一个例子,我可能会收到其中的 20 或 30 个,而且还有更多的项目。

我找不到一种方法来遍历日期对象并修改这些日期对象以删除 $date $ numberlong 字段以在最后得到相同的数组,但只有日期(如下所示):

"itemdate1" : "1627976225150"

而不是

"itemdate1": {
    "$date": {
        "$numberLong": "1627976225150"
    }
},

提前感谢您的帮助

【问题讨论】:

  • 我假设您没有使用应该为您进行日期转换的MongoDB Node Driver。你不是有理由吗?如果是这样,我可以编写一些递归代码来进行转换...
  • 嗨 @edemaine 我使用 mongodb Realm 作为 API,我直接收到这类请求。
  • docs.mongodb.com/realm/sdk/node/data-types/field-types 表示 Realm SDK 应该支持日期。您是否在架构中使用了"date"
  • 不,我没有完全创建架构。我会那样做的。
  • @edemaine,我检查了,但这不适用于我,因为我正在使用 MongoDB Realm 的第三方生成 api。

标签: javascript arrays date object


【解决方案1】:

您正在使用的对象采用名为EJSON 的格式。如果它们仍然是字符串,您应该能够通过EJSON.parse(string) 解析它们。如果没有,您可以将它们转换回 JSON,然后解析它们,如下所示:EJSON.parse(JSON.stringify(result))

【讨论】:

    【解决方案2】:

    Mongo.db EJSON 保留了 JSON 没有的类型,因此对日期等具有特殊结构。如果您没有 EJSON 解析器,您可以使用 reviver function 将对象转换回其原始类型。

    所以我猜是因为:

    "itemdate2": {
      "$date": {
        "$numberLong": "1627976225150"
      }
    },
    

    解析器应该返回一个日期对象,而不是时间值。日期可能被编码为时间值或 ISO 8601 字符串,因此 reviver 应该同时处理两者。下面是一个例子。

    let data = '[{"_id":{"$oid":"6108f221faf75fa7899e476c"},"id":{"$numberInt":"7"},"item1":"XX","item2":"YY","item3":"ZZ","itemdate1":{"$date":{"$numberLong":"1627976225150"}},"itemdate2":{"$date":{"$numberLong":"1627976225150"}},"itemdate5":{"$date":{"$numberLong":"1627976225150"}},"itemdate4":{"$date":{"$numberLong":"1627976225150"}}},{"_id":{"$oid":"6108f2219d0f3c7c8b188607"},"id":{"$numberInt":"11"},"item1":"AA","item2":"BB","item3":"CC","itemdate1":{"$date":{"$numberLong":"1627976225150"}},"itemdate2":{"$date":{"$numberLong":"1627976225150"}},"itemdate3":{"$date":{"$numberLong":"1627976225150"}},"itemdate4":{"$date":{"$numberLong":"1627976225150"}}}]';
    
    let obj = JSON.parse(data, (key, value) => 
      value.$date? new Date(
        typeof value.$date == 'object'? Number(value.$date.$numberLong) : value.$date
      ) : value
    );
    
    console.log(obj);

    如果你真的只想返回字符串值,那么 reviver 的主体可以是:

    value.$date? (value.$date.$numberLong || value.$date) : value
    

    【讨论】:

      猜你喜欢
      • 2020-01-12
      • 2022-11-25
      • 2010-11-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-25
      • 2021-11-28
      相关资源
      最近更新 更多