【问题标题】:Get latest version based on Id and date in array根据数组中的 ID 和日期获取最新版本
【发布时间】:2017-09-28 20:40:26
【问题描述】:

我有一个包含以下属性的 javascript 对象数组:_id, isVersionFrom, createdAt _id, isVersionFrom 存储了一个 mongoDb _id(当它是原始对象时,isVersionFrom 为 false)。 createdAt 有一个时代的时间戳。 现在我想为每个 _id 获取一个最新版本的数组。

例如,如果我有这个数组:

[ { _id: 'CXsqvJ3ArwpM7aQwg', createdAt: 1493630867411, isVersionFrom: false }, { _id: 'nnFthaqJ254BQozSp', createdAt: 1493630967411, isVersionFrom: 'CXsqvJ3ArwpM7aQwg' }, { _id: 'Jksfe6Aaof9hT8CW9', createdAt: 1493631067411, isVersionFrom: 'CXsqvJ3ArwpM7aQwg' }, { _id: 'HSitgQdFwYHqCjRax', createdAt: 1493631067411, isVersionFrom: false }, { _id: 'vhZZCKhyQgkNSGjqK', createdAt: 1493631077411, isVersionFrom: 'HSitgQdFwYHqCjRax' }, ]

我想要这个结果:

[ { _id: 'Jksfe6Aaof9hT8CW9', createdAt: 1493631067411, isVersionFrom: 'CXsqvJ3ArwpM7aQwg' }, { _id: 'vhZZCKhyQgkNSGjqK', createdAt: 1493631077411, isVersionFrom: 'HSitgQdFwYHqCjRax' }, ]

所以它基本上必须过滤掉所有旧版本的 id。

【问题讨论】:

    标签: javascript arrays mongodb meteor


    【解决方案1】:

    更新使用下划线的可能解决方案:

    const myArray = [
      {
        _id: "CXsqvJ3ArwpM7aQwg",
        createdAt: 1493630867411,
        isVersionFrom: false
      },
      {
        _id: "nnFthaqJ254BQozSp",
        createdAt: 1493630967411,
        isVersionFrom: "CXsqvJ3ArwpM7aQwg"
      },
      {
        _id: "Jksfe6Aaof9hT8CW9",
        createdAt: 1493631067411,
        isVersionFrom: "CXsqvJ3ArwpM7aQwg"
      },
      {
        _id: "HSitgQdFwYHqCjRax",
        createdAt: 1493631067411,
        isVersionFrom: false
      },
      {
        _id: "vhZZCKhyQgkNSGjqK",
        createdAt: 1493631077411,
        isVersionFrom: "HSitgQdFwYHqCjRax"
      }
    ];
    
    // Chain underscore methods to use seamlessly.
    const result = _.chain(myArray)
      // Group items either by isVersionFrom or by original _id.
      .groupBy(item => (!item.isVersionFrom ? item._id : item.isVersionFrom))
      // For each group take item with max date (latest) .
      .map(val => _.max(val, item => item.createdAt))
      // Get value of chain.
      .value();
    

    【讨论】:

    • 嘿,Ramil,很好的建议。唯一的问题是,当 isVersionFrom 为 false 并且数组中没有其他版本时,我仍然需要 isVersionFrom false 对象,因为该对象是原始对象。
    • @JoeriSmits 是否意味着如果isVersionFrom 内部有一些具有字符串值的元素,那么还有一个具有相等_idisVersionFrom: false 的元素?
    • 没错,对象是文件,上传的第一个文件有isVersionFrom: false所有下一个上传到这个文件顶部的文件有isVersionFrom: id of original file
    • 谢谢。我已经根据您的第一个版本编写了一个解决方案,但是您更新的解决方案更加简洁。我真的应该学习下划线:)。
    猜你喜欢
    • 2020-08-12
    • 2022-11-12
    • 1970-01-01
    • 2021-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-09
    • 2018-10-24
    相关资源
    最近更新 更多