我正在创建一个自动排名匹配系统,其中两名候选人可以选择相互排名,系统根据两名候选人的排名找到最佳匹配对。
更具体地说,“发布者”创建一个帖子,“申请人”申请,该应用程序创建两个排名条目,以允许双方分别排名。
我首先从数据库中获取这些排名,生成一个数据结构数组:
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/