【问题标题】:Javascript: Removing Semi-Duplicate Objects within an Array with ConditionsJavascript:使用条件删除数组中的半重复对象
【发布时间】:2021-12-30 00:07:55
【问题描述】:

我正在尝试删除数组中的“重复”对象,同时保留与之关联的最低值的对象。

~~原创

var array = [
 {
   "time": "2021-11-12T20:37:11.112233Z",
   "value": 3.2
 },
 {
   "time": "2021-11-12T20:37:56.115222Z",
   "value": 3.8
 },
 {
   "time": "2021-11-13T20:37:55.112255Z",
   "value": 4.2
 },
 {
   "time": "2021-11-13T20:37:41.112252Z",
   "value": 2
 },
 {
   "time": "2021-11-14T20:37:22.112233Z",
   "value": 3.2
 }
]

~~预期输出

var array = [
 {
   "time": "2021-11-12T20:37:11.112233Z",
   "value": 3.2
 },
 {
   "time": "2021-11-13T20:37:41.112252Z",
   "value": 2
 },
 {
   "time": "2021-11-14T20:37:22.112233Z",
   "value": 3.2
 }
]

到目前为止我所拥有的:

var result = array.reduce((aa, tt) => { 
    if (!aa[tt.time]) {
        aa[tt.time] = tt;
    } else if (Number(aa[tt.time].value) < Number(tt.value)) { 
        aa[tt.time] = tt;
    }
    return aa;
}, {});

console.log(result);

我意识到我正在尝试做的问题是“时间”属性与我认为是重复的其他时间值不同。

虽然对于这个用例,我不需要毫秒。 YYYY-MM-DDTHH:MM(到分钟)很好。当时间不完全相同时,我不确定如何针对这种情况实施减少方法。也许如果只检查字符串中的前 16 个字符?

如果需要任何其他信息,请告诉我。

【问题讨论】:

  • "到分钟就好":如果分钟相差1,但时间差真的只有5秒呢?比如 45:01 和 44:59? “也许如果只检查字符串中的前 16 个字符?” 这不是由您决定的吗?这会产生你想要的结果吗?
  • 请允许我澄清一下。我需要做忽略秒和毫秒的减少方法。因此,只检查时间值的前 16 个字符确实会产生我想要的结果。

标签: javascript arrays javascript-objects


【解决方案1】:

所以有几个问题:

  • 如果您只想检查前 16 个字符以检测重复,则应使用 tt.time 的子字符串作为 aa 的键,而不是整个字符串。

  • 既然你想要最小值,那么你的比较运算符是错误的。

  • 代码产生一个对象,而你想要一个数组,所以你仍然需要从对象中提取值。

这是您的代码进行了这些修改:

var array = [{"time": "2021-11-12T20:37:11.112233Z","value": 3.2},{"time": "2021-11-12T20:37:56.115222Z","value": 3.8},{"time": "2021-11-13T20:37:55.112255Z","value": 4.2},{"time": "2021-11-13T20:37:41.112252Z","value": 2},{"time": "2021-11-14T20:37:22.112233Z","value": 3.2}];

var result = Object.values(array.reduce((aa, tt) => { 
    var key = tt.time.slice(0, 16);
    if (!aa[key]) {
        aa[key] = tt;
    } else if (Number(aa[key].value) > Number(tt.value)) { 
        aa[key] = tt;
    }
    return aa;
}, {}));

console.log(result);

【讨论】:

  • 非常感谢您的回复。那工作得很好。我可能应该把它留到早上再回来!真的很感谢这么快的回答!
猜你喜欢
  • 1970-01-01
  • 2013-10-30
  • 1970-01-01
  • 1970-01-01
  • 2016-07-02
  • 2014-06-25
  • 1970-01-01
  • 1970-01-01
  • 2018-06-19
相关资源
最近更新 更多