通过第二个日期减少具有重复 ID 的对象数组 属性
Reduce an Array of Objects With Duplicate IDs by a Second Date Property
我有一个对象数组,所有对象都有至少 1 个具有相同 ID 的其他对象。我正在尝试将此数组缩减为仅 return 具有最新日期的对象。我正在处理的示例数组:
var arrObj = [
{id: 1, startDate: 2019-10-09},
{id: 1, startDate: 2019-10-05},
{id: 1, startDate: 2019-09-30},
{id: 2, startDate: 2018-08-05},
{id: 2, startDate: 2018-09-05}
]
我想要实现的输出:
var newArrObj = [
{id: 1, startDate: 2019-10-09},
{id: 2, startDate: 2018-09-05}
]
我找到了很多完全按ID减少或删除重复对象的例子,但我似乎找不到先识别具有相同ID的对象,然后减少一秒的例子属性.不幸的是,我一直发现自己创建了很多嵌套的 for 循环。有没有一种优雅的方法可以做到这一点?我需要能够在 ES5 或更早版本中完成。
var uniqueIDs = [];
for (a in arrObj) {
if(uniqueIDs.indexOf(arrObj[a].id) != -1) {
uniqueIDs.push(arrObj[a].id);
}
}
var newArrObj = [];
for(b in uniqueIDs) {
var uniqueId = uniqueIDs[b];
var uniqueIdObjs = arrObj.filter(function(x) {
return x.id === uniqueId;
});
for(c in uniqueIdObjs) {
var objDate = uniqueIdObjs[c].startDate;
//This is where I get stuck
}
}
您可以按日期对数组进行排序,获取 id
的数组并对其进行重复数据删除,然后 map
删除重复数据的数组以将它们替换为已排序数组中的实际对象,Array.find
将 return 第一个匹配结果 :
var arrObj = [
{ id: 1, startDate: "2019-10-09" },
{ id: 1, startDate: "2019-10-05" },
{ id: 1, startDate: "2019-09-30" },
{ id: 2, startDate: "2018-08-05" },
{ id: 2, startDate: "2018-09-05" }
];
// Sort by date
var sorted = arrObj.sort((a, b) => new Date(b.startDate) - new Date(a.startDate));
// dedupe the array of ids
var ids = [...new Set(sorted.map(o => o.id))];
// replace the ids with original objects
var result = ids.map(id => sorted.find(o => o.id === id));
console.log(result);
我会采用您首先将 ID 过滤为唯一性的风格,因为那是简单的部分。
然后你可以简单地链接数组函数来提取最后一个日期:
映射唯一 ID,以便您的 return 在末尾创建一个新数组。
过滤原始数组以仅包含具有我们现在处理的 ID 的对象
对使用相同 ID 的所有对象创建的临时数组进行排序,以便最新的排在第一位,return 第一个元素。
let finalResult = uniqueIDs.map( id => {
return arrayObj.filter( obj => obj.id === id )
.sort((a, b) => new Date(b.startDate) - new Date(a.startDate))[0];
多田! finalResult
现在是数组,每个 ID 仅包含一个对象,其中包含最新日期:)
我有一个对象数组,所有对象都有至少 1 个具有相同 ID 的其他对象。我正在尝试将此数组缩减为仅 return 具有最新日期的对象。我正在处理的示例数组:
var arrObj = [
{id: 1, startDate: 2019-10-09},
{id: 1, startDate: 2019-10-05},
{id: 1, startDate: 2019-09-30},
{id: 2, startDate: 2018-08-05},
{id: 2, startDate: 2018-09-05}
]
我想要实现的输出:
var newArrObj = [
{id: 1, startDate: 2019-10-09},
{id: 2, startDate: 2018-09-05}
]
我找到了很多完全按ID减少或删除重复对象的例子,但我似乎找不到先识别具有相同ID的对象,然后减少一秒的例子属性.不幸的是,我一直发现自己创建了很多嵌套的 for 循环。有没有一种优雅的方法可以做到这一点?我需要能够在 ES5 或更早版本中完成。
var uniqueIDs = [];
for (a in arrObj) {
if(uniqueIDs.indexOf(arrObj[a].id) != -1) {
uniqueIDs.push(arrObj[a].id);
}
}
var newArrObj = [];
for(b in uniqueIDs) {
var uniqueId = uniqueIDs[b];
var uniqueIdObjs = arrObj.filter(function(x) {
return x.id === uniqueId;
});
for(c in uniqueIdObjs) {
var objDate = uniqueIdObjs[c].startDate;
//This is where I get stuck
}
}
您可以按日期对数组进行排序,获取 id
的数组并对其进行重复数据删除,然后 map
删除重复数据的数组以将它们替换为已排序数组中的实际对象,Array.find
将 return 第一个匹配结果 :
var arrObj = [
{ id: 1, startDate: "2019-10-09" },
{ id: 1, startDate: "2019-10-05" },
{ id: 1, startDate: "2019-09-30" },
{ id: 2, startDate: "2018-08-05" },
{ id: 2, startDate: "2018-09-05" }
];
// Sort by date
var sorted = arrObj.sort((a, b) => new Date(b.startDate) - new Date(a.startDate));
// dedupe the array of ids
var ids = [...new Set(sorted.map(o => o.id))];
// replace the ids with original objects
var result = ids.map(id => sorted.find(o => o.id === id));
console.log(result);
我会采用您首先将 ID 过滤为唯一性的风格,因为那是简单的部分。 然后你可以简单地链接数组函数来提取最后一个日期:
映射唯一 ID,以便您的 return 在末尾创建一个新数组。
过滤原始数组以仅包含具有我们现在处理的 ID 的对象
对使用相同 ID 的所有对象创建的临时数组进行排序,以便最新的排在第一位,return 第一个元素。
let finalResult = uniqueIDs.map( id => { return arrayObj.filter( obj => obj.id === id ) .sort((a, b) => new Date(b.startDate) - new Date(a.startDate))[0];
多田! finalResult
现在是数组,每个 ID 仅包含一个对象,其中包含最新日期:)