我正在尝试从 AJAX 响应返回的对象数组中获取唯一的对象。我发现了类似的东西here,但我还有一个额外的条件,不知道如何解决它。
部分代码如下:
$.ajax({
type: "POST",
dataType: "json",
contentType: "application/json; charset=utf-8",
cache: false,
url: '<%= ResolveUrl("../WebService/ABC.asmx/GetSomething") %>',
data: JSON.stringify({ StartDate: startDate, EndDate: endDate }),
}).done(function (result) {
jResult = JSON.parse(result.d);
uniqueLabels = [];
// This is from another SOF post
// Get unique A records where B is 'H2'
var a = jResult.filter((value, index, self) => {
return self.findIndex(v => v.A === value.A && v.B == 'H2') === index;
});
但是,可能有多个记录具有相同的 A 值并且 B 等于 H2,如果是这种情况,我需要选择最新的记录(每个对象中的时间戳为 C)。
上面确实返回了 B 等于“H2”的唯一 A 记录,但不一定是最新的。
示例 jResult,第一个和第三个具有相同的 A 和 B 值,不同的时间戳:
{
"A": "037413172",
"B": "H2",
"C": "2024-04-08T08:45:13.989605",
"D": "BE"
}
{
"A": "037413172",
"B": "NQ",
"C": "2024-04-08T09:06:29.484146",
"D": "BE"
}
{
"A": "037413172",
"B": "H2",
"C": "2024-04-09T10:03:39.484296",
"DEST_COUNTRY": "BE"
}
{
"A": "216023781",
"B": "NQ",
"C": "2024-04-08T11:53:46.910811",
"D": "AT"
}
首先,您应该按具有所请求的
B
的所有项目进行过滤。那么你应该“按具有最新的 item.C
的键对对象进行分组”。我很喜欢使用 reduce
但它只是在正确的对象键上设置值。最后我们返回结果,即对象现在的唯一值。
function getUnique(arr, B) {
var brr = arr.filter(item => item.B === B)
var crr = brr.reduce(function(agg, item) {
if (!agg[item.A] || agg[item.A].C <= item.C) {
agg[item.A] = item
}
return agg
}, {})
var drr = Object.values(crr)
return drr;
}
var arr = [{
"A": "037413172",
"B": "H2",
"C": "2024-04-08T08:45:13.989605",
"D": "BE"
},
{
"A": "037413172",
"B": "NQ",
"C": "2024-04-08T09:06:29.484146",
"D": "BE"
},
{
"A": "037413172",
"B": "H2",
"C": "2024-04-09T10:03:39.484296",
"DEST_COUNTRY": "BE"
},
{
"A": "216023781",
"B": "NQ",
"C": "2024-04-08T11:53:46.910811",
"D": "AT"
}
]
console.log(getUnique(arr, "H2"))
console.log(getUnique(arr, "NQ"))
.as-console-wrapper {
min-height: 100%
}