Javascript 如何从对象数组中获取具有特定键的唯一值的对象?
我有一个如下所示的对象数组Javascript 如何从对象数组中获取具有特定键的唯一值的对象?,javascript,arrays,Javascript,Arrays,我有一个如下所示的对象数组 [{ "_id": { "$oid": "5d9a16764f66ef0017a738ee" }, "user": "tVH3U5Va4cBFiATvAACD", "team": "team1", "question": "5d98c7109d0e1d0017e3d31f", "date": { "$date": "2019-10-
[{
"_id": {
"$oid": "5d9a16764f66ef0017a738ee"
},
"user": "tVH3U5Va4cBFiATvAACD",
"team": "team1",
"question": "5d98c7109d0e1d0017e3d31f",
"date": {
"$date": "2019-10-06T16:29:40.240Z"
},
"correct": "true",
"ownId": "4",
"blockId": "1"
},
{
"_id": {
"$oid": "5d9a167c4f66ef0017a738ef"
},
"user": "tVH3U5Va4cBFiATvAACD",
"team": "team1",
"question": "5d98c7109d0e1d0017e3d31f",
"date": {
"$date": "2019-10-06T16:29:46.694Z"
},
"correct": "true",
"ownId": "4",
"blockId": "1"
},
{
"_id": {
"$oid": "5d9a16824f66ef0017a738f0"
},
"user": "tVH3U5Va4cBFiATvAACD",
"team": "team1",
"question": "5d98c7109d0e1d0017e3d31e",
"date": {
"$date": "2019-10-06T16:29:52.900Z"
},
"correct": "true",
"ownId": "5",
"blockId": "1"
}]
我需要获取具有最后日期的对象,该对象具有唯一的user、ownId和blockId。“唯一”的意思是,我将只获得一个具有相同ownId和相同blockId的用户。对于这个示例,我只想获取,因为数组中的第一个对象和数组中的最后一个对象具有相同的user、ownId和blockId
我尝试的是通过数组进行排序,但这样我只能在一个键中获得唯一的对象。我想不出用几把钥匙怎么用
stat.forEach(function(item) {
var i = unique.findIndex(x => x.user == item.user);
if (i <= -1) {
unique.push({
id: item._id,
user: item.user
});
}
});
您可以使用方法在数组上迭代,以user+ownId+blockId作为属性名或哈希键构建哈希表或对象
迭代时,如果存在具有相同键的对象,则比较日期并用具有最新日期的对象替换该值
var数据=[{u id:{$oid:5d9a16764f66ef0017a738ee},用户:tVH3U5Va4cBFiATvAACD,团队1,问题:5d98c7109d0e1d0017e3d31f,日期:{$date:2019-10-06T16:29:40.240Z},正确:true,ownId:4,blockId:1},{u id:{$oid:5d9a167c4f66ef0017a738ef},用户:TVH3U4CBFiatVA1,团队:D7D0017D3,问题:{$date:2019-10-06T16:29:46.694Z},正确:true,ownId:4,blockId:1},{$id:5d9a16824f66ef0017a738f0},用户:TVH3U5VA4CBFIATCD,团队:team1,问题:5d98c7109d0e1d0017e3d31e,日期:{$date:2019-10-06T16:29:52.900Z},正确:true,ownId:5,blockId:1};
var result=Object.valuesdata.reduceac,curr=>{
let value=acc[curr.user+curr.ownId+curr.blockId];
如果!value | | new Datecurr.date.$date>new Datevalue.date.$date{
acc[curr.user+curr.ownId+curr.blockId]=curr;
}
返回acc;
}, {};
console.logresult;您可以使用方法在数组上迭代,以user+ownId+blockId作为属性名或哈希键构建哈希表或对象
迭代时,如果存在具有相同键的对象,则比较日期并用具有最新日期的对象替换该值
var数据=[{u id:{$oid:5d9a16764f66ef0017a738ee},用户:tVH3U5Va4cBFiATvAACD,团队1,问题:5d98c7109d0e1d0017e3d31f,日期:{$date:2019-10-06T16:29:40.240Z},正确:true,ownId:4,blockId:1},{u id:{$oid:5d9a167c4f66ef0017a738ef},用户:TVH3U4CBFiatVA1,团队:D7D0017D3,问题:{$date:2019-10-06T16:29:46.694Z},正确:true,ownId:4,blockId:1},{$id:5d9a16824f66ef0017a738f0},用户:TVH3U5VA4CBFIATCD,团队:team1,问题:5d98c7109d0e1d0017e3d31e,日期:{$date:2019-10-06T16:29:52.900Z},正确:true,ownId:5,blockId:1};
var result=Object.valuesdata.reduceac,curr=>{
let value=acc[curr.user+curr.ownId+curr.blockId];
如果!value | | new Datecurr.date.$date>new Datevalue.date.$date{
acc[curr.user+curr.ownId+curr.blockId]=curr;
}
返回acc;
}, {};
console.logresult;希望我已经理解了您的目标是什么。类似的东西可能适合您,我假设您的对象数组称为stat:
希望我已经理解了您的目标。类似的东西可能适合您我假设您的对象数组称为stat:
向我们展示您的尝试。Stack Overflow不是免费的代码编写服务。这里的目标是让您展示自己解决问题的尝试。没有展示任何尝试,看起来您只是想让其他人为您编写所有代码,以便添加到Charlie的评论中,charlietfl是绝对正确的,您需要展示您的一些想法工作…你还可以扩展一下你正在尝试做的事情吗?你是说除了日期比较过滤器之外,你还想过滤出结果对象的属性吗?另外,这个线程可能会有所帮助:我添加了我尝试过的内容。在fasct中,我知道如何用一个键过滤对象数组,但我不知道如何用几个键进行过滤。向我们展示w你已经尝试过的。Stack Overflow不是免费的代码编写服务。这里的目标是让你展示你自己解决自己问题的尝试。没有展示任何尝试,看起来你只是想让其他人为你编写所有代码。要添加到Charlie的评论中,charlietfl是绝对正确的,你需要展示你的一些工作…can您还扩展了一些您正在尝试执行的操作?您是说除了日期比较筛选器之外,还想筛选出结果对象的属性吗?此外,此线程可能会有所帮助:我添加了我尝试过的内容。在fasct中,我知道如何使用一个键筛选对象数组,但我不知道如何使用很少的键进行筛选。您的方法是有趣的是,我会防御性地记住它。但是你的代码不起作用,看起来最好在内部使用&&而不是| |,如果它至少能更接近我预期的效果。另外,在检查之前对数组进行排序也更好。谢谢你,你的方法很有趣,我会防御性地记住它。但是你的代码不起作用,看起来像是b如果在l处,最好在内部使用&&而不是| | 它的工作原理更接近我的预期。此外,最好在此检查之前对数组进行排序。非常感谢。
stat.forEach(function(item) {
var i = unique.findIndex(x => x.user == item.user);
if (i <= -1) {
unique.push({
id: item._id,
user: item.user
});
}
});
const seenOwnIds = [];
const seenBlockIds = [];
const seenUserIds = [];
const uniqueUserArray = [];
for (let obj of stat) {
if ( seenOwnIds.includes(obj.ownId) || seenBlockIds.includes(obj.blockId) || seenUserIds.includes(obj.user) ) {
continue;
}
else {
seenOwnIds.push(obj.ownId);
seenBlockIds.push(obj.blockId);
seenUserIds.push(obj.user);
uniqueUserArray.push(obj);
}
};
let lastDate = null;
let lastDateObj = {};
for (let obj of uniqueUserArray) {
const curDate = new Date(obj.date.$date);
if ( lastDate == null || curDate > lastDate ) {
lastDate = curDate;
lastDateObj = obj;
}
}