Javascript:使用条件删除数组中的半重复对象

Javascript: Removing Semi-Duplicate Objects within an Array with Conditions

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

~~原创

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

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

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

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

所以有几个问题:

  • 如果您只想检查前 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);