从 AJAX 响应中获取唯一对象

问题描述 投票:0回答:1

我正在尝试从 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"
}
javascript jquery unique
1个回答
0
投票

首先,您应该按具有所请求的

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%
}

© www.soinside.com 2019 - 2024. All rights reserved.