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