gpt4 book ai didi

javascript - 如何有效且高效地将项目分组到配对的存储桶中(如果存在)

转载 作者:行者123 更新时间:2023-11-28 03:38:48 25 4
gpt4 key购买 nike

我正在创建一个自动排名匹配系统,其中两名候选人可以选择相互排名,系统根据两名候选人的排名找到最佳匹配对。

更具体地说,“发布者”创建一个帖子,“申请人”申请,该应用程序创建两个排名条目,以允许双方分别排名。

我首先从数据库中获取这些排名,生成一个数据结构数组:

rankings ==> [ {postID, rankerID, rankeeID, ranking}, ...]

然后我按 postID(使用 Lodash 的 groupBy)对这些排名进行分类:

_.groupBy(rankings, rank => rank.postID);

这会根据 postID 生成分桶排名,例如:

{
postID_1: [
{ postID: 'postID_1', rankerID: 'applicantA', rankeeID: 'posterA', ranking: 1 },
{ postID: 'postID_1', rankerID: 'posterA', rankeeID: 'applicantA', ranking: 4 }
],
postID_2: [
{ postID: 'postID_2', rankerID: 'posterB', rankeeID: 'applicantA', ranking: 3 },
{ postID: 'postID_2', rankerID: 'applicantA', rankeeID: 'posterB', ranking: 5 },
{ postID: 'postID_2', rankerID: 'applicantB', rankeeID: 'posterB', ranking: 1 }
],
...
}

请注意,并不总是存在完整的配对来显示海报 ==> 申请人和申请人 ==> 海报的排名。

最终,我想根据具体标准和排名来确定最佳海报申请者匹配候选者,因此我需要确定如何将上述结构转换为成对的桶,作为期望的结果:

{
postID_1: [
[
{ rankerID: 'applicantA', rankeeID: 'posterA', ... },
{ rankerID: 'posterA', rankeeID: 'applicantA', ... }
]
],
postID_2: [
[
{ rankerID: 'applicantA', rankeeID: 'posterB', ... },
{ rankerID: 'posterB', rankeeID: 'applicantA', ... }
],
[
{ rankerID: 'applicantB', rankeeID: 'posterB', ... }
]
],
...
}

我只是在用函数式编程对(可能)现有的配对进行存储时,在制定数据转换时遇到了麻烦。

最佳答案

给你!我们使用 Array.reduce 并检查“该对的另一半”是否已经存在,如果存在则完成。否则我们添加一对新的。

const data = {  postID_1: [    {      postID: "postID_1",      rankerID: "applicantA",      rankeeID: "posterA",      ranking: 1    },    {      postID: "postID_1",      rankerID: "posterA",      rankeeID: "applicantA",      ranking: 4    }  ],  postID_2: [    {      postID: "postID_2",      rankerID: "posterB",      rankeeID: "applicantA",      ranking: 3    },    {      postID: "postID_2",      rankerID: "applicantA",      rankeeID: "posterB",      ranking: 5    },    {      postID: "postID_2",      rankerID: "applicantB",      rankeeID: "posterB",      ranking: 1    }  ]};

const result = Object.entries(data).reduce(
(accResult, [key, postData]) => ({
...accResult,
[key]: postData.reduce((acc, val) => {
const secondHalf = acc.find(
([{ rankerID, rankeeID }]) =>
rankerID === val.rankeeID && rankeeID === val.rankerID
);
if (secondHalf) {
secondHalf.push(val);
return acc;
} else {
return acc.concat([[val]]);
}
}, [])
}),
{}
);

console.log(result);

关于javascript - 如何有效且高效地将项目分组到配对的存储桶中(如果存在),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57469123/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com