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);
我正在尝试删除数组中的“重复”对象,同时保留具有最低关联值的对象。
~~原创
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);