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

标签 javascript functional-programming lodash

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

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

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

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/

相关文章:

javascript - 根据属性值从对象数组中获取值

Javascript:对象方法与 Object.prototype 方法

javascript - 全尺寸背景图像到 SVG 路径

Haskell 应对 3n+1 挑战的方法

scala - 更优雅的写法 if(list.nonEmpty) Some(list.max) else None?

javascript - lodash合并n个数组

javascript - availableWidth 在 mozilla 和 IE 中不起作用

javascript - 是否可以在 GA 中可靠地创建先赢自定义维度?

Haskell:理解广义代数数据类型

javascript - 展平数组并查找相应值并写入新数组