如何对数组中的对象进行分组并根据对象属性对它们进行排序

2024-03-25

 groupSelectedQuestions(selectedQuestions){
     var questions = [
         { q: 'why?', group: 'no-group', date: '1' }, 
         { q: 'what?', group: 'group 1', date: '1' }, 
         { q: 'when?', group: 'group 2', date: '2' }, 
         { q: 'where?', group: 'group 1', date: '2' }, 
         { q: 'which', group: 'group 2', date: '3' }
     ],
     result = questions.reduce(function (r, a) {
         r[a.group] = r[a.group] || [];
         r[a.group].push(a);
         return r;
     }, {});
     /**
     more code here.
     Here I would put if statements that check for all condtions
     I have stated in the question below
     */
 }

我正在尝试创建一个用户调用的函数并将问题分组到某些组中。上面你可以看到我提出的部分代码。

关于如何对问题进行分组,我有很多条件。

  1. 任何小组的问题数量不得少于两个。
  2. 'no-group'表示问题不属于任何组。所以'no-group'可以只是一个问题,也可以是所有问题。
  3. 应按该组问题中最早的日期分配组。例如'group 1'最早的(就日期而言)问题应该早于 ' 中最早的问题group 2'当问题重新分组或问题从组中删除时,也应该重新调整。
  4. 分组的问题可以重新分组。这样做时,如果有任何问题单独留在小组中,则应将其标记为'no-group'.
  5. 当分配组时'group 1'被分配'group 2', when 'group 2'被分配'group 3'等等。

我的方法是使用 if 语句。但是,由于问题数组最多可以有二十个问题,并且分组可以从'group 1', 'group 2'... to 'group 20',if语句的数量就会变得很多。

我制造了一个堆栈闪电战 https://stackblitz.com/edit/angular-e2fyaa?file=src%2Fapp%2Fapp.component.html更好地传达我想要实现的目标。有没有一种方法可以使用递归来实现我想要实现的目标并避免许多 if 语句?

如果有不清楚的地方请询问,我很乐意澄清。

stackblitz中的代码如下(它是Angular stackblitz):

控制器

  questions = [
    { _id:1, q: 'why?', group: 'no-group', date: '1', selected:false }, 
    { _id:2, q: 'what?', group: 'group 1', date: '1', selected:false }, 
    { _id:3, q: 'when?', group: 'group 2', date: '2', selected:false }, 
    { _id:4, q: 'where?', group: 'group 1', date: '2', selected:false }, 
    { _id:5, q: 'which?', group: 'group 2', date: '3', selected:false }
  ];

  selectOrUnselectQuestion(question){
    let newQuestions = this.questions.map(newQuestion => {
      if(newQuestion._id === question._id){
        if(!newQuestion.selected){
            newQuestion.selected = true;
          } else {
            newQuestion.selected = false;
          }
        return newQuestion;
        } else {
          return newQuestion;
        }
      })
      this.questions = newQuestions; 
  }

  groupSelectedQuestions(){
    let selectedQuestions = this.questions.filter(q => q.selected);
    let selectedQuestionIds = selectedQuestions.map(selectedQuestion=>{ return selectedQuestion._id; })
    let newQuestions = this.questions.map(question => {
      if(selectedQuestions.length==1 && selectedQuestionIds.includes(question._id)){
        question.group = 'no-group';
        question.selected = false;
        return question
      } else 
      if(selectedQuestions.length>1 && selectedQuestionIds.includes(question._id)){
        question.group = 'group 1';
        question.selected = false;
        return question
      } else {
        return question;
      }
    })
    this.questions = newQuestions;

    // deselect selected questions

  }

风景:

<div style="text-align:center">Questions</div>

<div style="text-align:center; padding:10px;">

    <div *ngFor="let question of questions" (click)="selectOrUnselectQuestion(question)"
        [ngClass]="{'selected': question.selected}" class="question">
        <span style="padding-right:10px">{{question.q}}</span>
        <span>{{question.group}}</span>
    </div>

    <button (click)="groupSelectedQuestions()" style="margin:10px 0" type="button">
    group selected questions
  </button>

</div>

恐怕评论中的讨论对我的理解没有多大帮助。

这是仍然猜测您的一些要求的尝试:

// utility functions
const groupBy = (prop) => (xs) => 
  xs .reduce (
    (a, {[prop]: p, ...rest}) => ({...a, [p]: [...(a[p] || []), rest]}),
    {}
  )

const partition = (pred) => (xs) =>
  xs .reduce (([yes, no], x) => pred (x) ? [[...yes, x], no] : [yes, [...no, x]], [[], []])

// main function
const makeGroups = questions => {
  const {'no-group': groupless, ...rest} = groupBy ('group') (questions)
  const [largeEnough, tooSmall] = partition ((v) => v.length > 1) (Object .values (rest))
  const noGroup = [...groupless, ...tooSmall.flat()].sort((a, b) => a.date - b.date)
  return {
    ...Object .fromEntries (
      largeEnough
        .map (group => group.sort ((a, b) => a .date - b .date))
        .sort ((group1, group2) => group1 [0] .date - group2 [0] .date)
        .map ((group, i) => [`group ${i + 1}`, group])
    ),
    'no-group': noGroup
  }
}

// sample data
const questions = [
  {_id: 1, q: 'why?', group: 'no-group', date: '8', selected: false }, 
  {_id: 2, q: 'what?', group: 'A', date: '6', selected: false }, 
  {_id: 3, q: 'when?', group: 'C', date: '7', selected: false }, 
  {_id: 4, q: 'where?', group: 'A', date: '5', selected: false }, 
  {_id: 5, q: 'which?', group: 'B', date: '3', selected: false },
  {_id: 6, q: 'who?', date: '0', selected: false }, // no group supplied so will end up in no-group
  {_id: 7, q: 'why not?', group: 'B', date: '9', selected: false }, 
  {_id: 8, q: 'who, me?', group: 'A', date: '4', selected: false }, 
  {_id: 9, q: 'where is waldo?', group: 'A', date: '1', selected: false }, 
  {_id: 10, q: 'which way is up?', group: 'B', date: '2', selected: false },
  {_id: 11, q: 'when is lunch?', group: 'D', date: '10', selected: false }, 
];
// demo
console .log (makeGroups (questions))
.as-console-wrapper {max-height: 100% !important; top: 0}

输出将如下所示:

{
  'group 1': [
    {_id: 9, q: "where is waldo?", date: "1", selected: false},
    {_id: 8, q: "who, me?", date: "4", selected: false},
    {_id: 4, q: "where?", date: "5", selected: false},
    {_id: 2, q: "what?", date: "6", selected: false}
  ],
  'group 2': [
    {_id: 10, q: "which way is up?", date: "2", selected: false},
    {_id: 5, q: "which?", date: "3", selected: false},
    {_id: 7, q: "why not?", date: "9", selected: false}
  ],
  'no-group': [
    {_id: 6, q: "who?", date: "0", selected: false},
    {_id: 3, q: "when?", date: "7", selected: false},
    {_id: 1, q: "why?", date: "8", selected: false},
    {_id: 11, q: "when is lunch?", date: "10",selected: false}
  ]
}

组在内部按日期排序,并且组之间按列表中的第一个日期排序。任何没有至少两个条目的组都会被折叠成no-group并且组号是按顺序分配的。

最大的问题是这是否符合您的需求。如果没有,您能否像我在这里所做的那样显示示例输入和预期输出?

更新:内联助手

虽然我是辅助函数的忠实粉丝并且我使用它partition偶尔还有一个稍微概括的版本groupBy通常,我想指出,由于每个仅使用一次,因此我们可以非常简单地内联它们:

const makeGroups = questions => {
  const {'no-group': groupless, ...rest} = questions .reduce (
    (a, {group = 'no-group', ...rest}) => ({...a, [group]: [...(a[group] || []), rest]}),
    {}
  )
  const [largeEnough, tooSmall] = Object .values (rest) .reduce (
      ([yes, no], x) => x.length > 1 ? [[...yes, x], no] : [yes, [...no, x]], [[], []]
  )
  const noGroup = [...groupless, ...tooSmall.flat()].sort((a, b) => a.date - b.date)
  return {
    ...Object .fromEntries (
      largeEnough
        .map (group => group.sort ((a, b) => a .date - b .date))
        .sort ((group1, group2) => group1 [0] .date - group2 [0] .date)
        .map ((group, i) => [`group ${i + 1}`, group])
    ),
    'no-group': noGroup
  }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何对数组中的对象进行分组并根据对象属性对它们进行排序 的相关文章

  • 数组排序错误:“二元运算符 '<' 无法应用于两个 'Int?'操作数”

    这是按 tableView 时间戳中的每个单元格对数组进行排序的代码 self ProjectsArray sorted by project project2 gt Bool in return project timestamp int
  • 如何将 scala 列表转换为 javascript 数组?

    有更简单的方法吗 document ready function var jsArray if scalaList null for id lt scalaList jsArray push id 很简单 如下所示 import play
  • 使用 jQuery live() 初始化插件?

    使用 jQuery 在特定类的所有当前和未来元素上自动初始化插件的最佳方法是什么 例如 假设我想要全部
  • Durandal SPA 与打字稿有关的问题

    我使用 TypeScript 1 8 将我的 durandal SPA 应用程序从 VS 2012 更新到 VS 2015 它将生成 JavaScript ECMA5 我解决了所有构建错误 但我无法修复一个名为 return 语句只能在函数
  • 如何使用 BufferedReader 对象从 Java 中的一行读取多个整数值?

    我正在使用 BufferedReader 类读取 Java 程序中的输入 我想读取用户的输入 该用户可以在带空格的单行中输入多个整数数据 我想读取整数数组中的所有这些数据 输入格式 用户首先输入他 她想要输入的数字数量 然后在下一行中使用多
  • jQuery 在附加元素后立即返回 div 元素的高度 0

    我有一个浮动 div 最初没有内容 我使用 jQuery 将一组元素附加到 div 然后立即调用原始 div 的 height 方法 我添加的元素在样式表中具有定义的最小高度 而浮动 div 则没有 问题是 当我在原始 div 上调用 he
  • 如何使用javascript将视频文件转换为字符串?

    我在 signalR 工作 我想通过将视频文件拆分为不同部分来将视频文件从一个客户端发送到另一个客户端 我已经通过分割图像源数据发送图像并在另一个客户端上接收该图像 document getElementById fileUpload ad
  • 从本地 html/javascript 网站插入 mySQL 数据库

    我正在尝试做什么 我的程序的目的是插入数据local HTML JS网站变成online 非本地 mySQL数据库 到目前为止我尝试过的 我试图用来实现此目的的原始方法是让我的本地网站使用 javascript 通过在线发布数据PHP文件
  • 当系列没有相同的时间值时,如何在工具提示中显示所有系列

    我有一个显示多个时间序列的图表 不同时间序列不会同时采样 有没有办法在工具提示中显示所有系列 在示例中 您可以看到所有系列都包含在前 2 个点的工具提示中 因为它们是同时采样的 其余点仅包含 1 个系列 var myChart echart
  • 全日历与 UTC 和本地日期的混淆

    我确实让 fullcalendar 正常初始化 所以它代表当前日期 午夜 gt 午夜 1 天 1 小时时段 我从其他一些数据源获取带有时间戳的数据 格式为 YYYY MM DD HH mm 作为字符串传输 无时区信息 因此 我将该字符串转换
  • React setState回调返回值

    我是 React 新手 我希望实现这种流程 set the state execute a function f an async one which returns a promise set the state again return
  • axios 如何将 blob 与 arraybuffer 作为响应类型处理?

    我正在下载一个 zip 文件axios https www npmjs com package axios 为了进一步处理 我需要获取已下载的 原始 数据 据我所知 Javascript 有两种类型 Blob 和 Arraybuffers
  • 如何将类组件中的 props 发送到功能组件?

    我是 ReactJS 的初学者 需要知道如何将一个页面中的 props 值发送到另一个页面 道具位于第一页上我可以获取类组件值如何获取另一页中的值 提前致谢 墙色 jsx import React Component from react
  • Python 中的 Firebase 身份验证时出现 KeyError:“databaseURL”

    相信你做得很好 我是 firebase 的新手 正在尝试进行用户身份验证 我已经安装了pyrebase4并在firebase控制台上创建了一个项目 我还启用了使用 电子邮件和密码 登录并尝试连接我的应用程序 下面是我正在尝试的代码 impo
  • 如何在 Node.js 中打开 Windows-1255 编码文件?

    我有一个 Windows 1255 希伯来语 编码的文件 我希望能够在 Node js 中访问它 我尝试使用打开文件fs readFile 它给了我一个Buffer我无能为力 我尝试将编码设置为Windows 1255 但这没有被识别 我还
  • 分配函数后如何删除 onmouseout 事件?

    我有一个问题 我正在为 onmouseout 事件分配一个函数 但运行该事件后 我需要将其删除 将非常感谢您的帮助 这取决于你的代码 如果你用 d3 这样做 那么你可以说 在 onmouseout 事件函数中 element on mous
  • java中wav文件转换为字节数组

    我的项目是 阿塞拜疆语音的语音识别 我必须编写一个程序来转换wav文件到字节数组 如何将音频文件转换为byte 基本上如第一个答案中的片段所描述 但不是BufferedInputStream use AudioSystem getAudio
  • 使用 NodeJS 创建 YouTube 播放列表

    我正在尝试使用 NodeJS 服务器创建 YouTube 播放列表 我已按照 Oauth 的 NodeJS 快速入门说明进行操作 如以下链接所示 https github com youtube api samples blob maste
  • 如何加载Jquery Tiny滚动条

    所以我想自定义一个滚动条 我发现了一个很小的滚动条 这是一个jquery插件 http baijs nl tinyscrollbar http baijs nl tinyscrollbar 问题是 无论如何我都无法让它工作 我将 Jquer
  • 如何将函数导入到Vue组件中?

    我正在尝试将单个函数导入到我的 Vue 组件中 我为我的函数创建了一个单独的 js 文件 randomId js exports randomId gt My function 在我的 Vue 组件中 我导入了 Random js let

随机推荐

  • 将羊驼导入 React.js

    我正在尝试在 React 应用程序中使用羊驼形式 import React useEffect useRef from react import from jquery import as popper from popper js imp
  • TextView 中的行号、代码突出显示

    我正在为 Android 开发一个 IDE 它对于编辑短脚本 对文件进行快速调整可能很有用 目前我只使用一个简单的 EditText 但我想添加几个功能 例如 EditText 左侧的行编号和代码突出显示 有人对如何解决这个问题有任何建议吗
  • Laravel 4 - 容器类:共享函数和闭包逻辑

    我对这里讨论的问题有一个后续问题 Laravel 核心方法混乱 https stackoverflow com questions 15758936 laravel core method confusion 17295616 172956
  • 如何处理 SQL 中的引号 ' [重复]

    这个问题在这里已经有答案了 我有一个数据库 其中包含 John Doe 等姓名 不幸的是 其中一些姓名包含引号 例如 Keiran O Keefe 现在 当我尝试搜索此类名称时 如下所示 SELECT FROM PEOPLE WHERE S
  • 替换 WPF 入口点

    WPF定义了自己的Main 方法 我应该如何用我自己的替换它Main 通常 打开 WPF 的方法MainWindow 例如通过命令行参数添加非 WPF 脚本模式 一些示例描述了将 App xaml 的构建操作从ApplicationDefi
  • BNF、EBNF、ABNF:选择哪一个?

    我想提出一种语言语法 我读过一些关于这三个人的内容 但确实看不出有什么是一个人能做而另一个人做不到的 有什么理由使用其中一种而不是另一种吗 或者这只是一个偏好问题 你必须考虑一下EBNF and ABNF作为扩展 可以帮助您在开发语法时更加
  • 如何将没有文件名的 multipart/form-data 文件绑定到 ASP.NET Core 中的 IFormFile

    在 ASP NET Core 3 1 中接受 multipart form data 参数的简单控制器操作中 using System ComponentModel DataAnnotations using Microsoft AspNe
  • FragmentActivity 无法通过 ActivityInstrumentationTestCase2 进行测试

    我在针对利用最近发布的 Fragment 支持 API 的 Android 应用程序执行 Android 单元测试时遇到问题 当针对 FragmentActivity 运行测试时 日志中会显示以下错误 并且类无法加载 当针对相同的类 但派生
  • 通过 Curl OpenId

    如何使用 Curl 进行基于 OpenId 的身份验证 首先我能做到吗 问候 阿拉巴克什 我想你正在谈论curl命令行 而不是库 我没有尝试过 但是根据我对OpenID和curl的了解 应该是可以的 但是 还没有完全自动化 如果您想要真正轻
  • 如何在 Ubuntu 16.10 上安装 Python 3.6 的 pip?

    首先我想指出这个问题可能看起来像是重复的 但事实并非如此 我在这里看到的所有问题都是关于 Python 3 的 pip 而我正在谈论 Python 3 6 当时使用的步骤不适用于 Python 3 6 我从以下位置获得了清晰的 Ubuntu
  • Kotlin 泛型

    如何为 Kotlin 中的方法强制执行泛型类型 例如 我知道您可以执行以下操作 var someVar MutableSet
  • java.lang.IllegalArgumentException:无法在形状为 [2] 的 TensorFlowLite 张量和形状为 [1, 2] 的 Java 对象之间复制

    我已经在 keras 中训练了自己的图像分类模型 并将其转换为 tflite 然后我想通过 tensorflow lite 在 android 中使用该模型 为此 我使用了一个 github 项目来直接获取该项目的应用程序链接 如下 htt
  • 如何自定义 FloatingActionButton 的大小

    FloatingActionButton 默认有两种尺寸 普通和迷你 我需要另一个 比正常的大 app fabSizexml 中的参数变为private int mSize 变量在FloatingActionButton班级 实际大小将由以
  • 在 Docker for Mac 上启动 Ingress 服务

    Using kubectl expose deployment
  • 显示构建错误弹出窗口的代码块

    我正在尝试编译一个简单的 hello world 程序 但 codeblocks v 13 12 总是向我展示It seems that this file has not been built yet Do you want to bui
  • 音频服务播放系统音量控制

    我想问一下有没有办法控制系统音效的音量 当我在游戏中按下音量控制开关 向上和向下 时 系统音效不会受到影响 我还读到这应该受到铃声音量的影响 但奇怪的是 当我上下按音量时 我没有看到扬声器图标顶部的小铃声文本 当我按下音量控制时 我只看到顶
  • GWT 中scheduleDeferred 的用法?

    您好 请告诉我以下代码在 GWT 中的用法 Scheduler get scheduleDeferred new ScheduledCommand Override public void execute code Thanks 它推迟一些
  • 错误“Telerik 未定义”

    运行我的项目时 我收到 JScript 错误 Microsoft JScript 运行时错误 Telerik 未定义 我刚刚尝试从菜单栏 Telerik gt Rad control for asp net ajax gt configur
  • 如何从 JSON 文件获取 DialogFlow 中的 API V2 密钥?

    5 月 31 日之后还有使用 DialogFlow 的人吗 现在有API V2 密钥需要从JSON文件中获取 网上确实没有资料 Json文件 https i stack imgur com emkwE png 从您的代理设置中单击Servi
  • 如何对数组中的对象进行分组并根据对象属性对它们进行排序

    groupSelectedQuestions selectedQuestions var questions q why group no group date 1 q what group group 1 date 1 q when gr