【问题标题】:Filter Map and Reduce过滤 Map 和 Reduce
【发布时间】:2019-02-19 12:56:15
【问题描述】:

我有以下代码行:

          $scope.listDeColaboradoresObject.forEach(item => {
            item.listNmAssunto = $scope.relatorioTotalMensagensRespondidasColab
              .filter(x => x.nmUsuario == item.nmUsuario)
              .map(x => x.nmAssunto);
            item.listNmAssunto = $scope.removeDuplicates(item.listNmAssunto);

            item.listDtResposta = $scope.relatorioTotalMensagensRespondidasColab
              .filter(x => x.nmUsuario == item.nmUsuario)
              .map(x => x.dtResposta);

          });

贯穿这个数组:

0: {deTipoAtendimento: "012", nmAssunto: "Cartão extraviado", nmUsuario: "15", dtResposta: "2018", total: 1}
1: {deTipoAtendimento: "012", nmAssunto: "Assunto Novo 012", nmUsuario: "Admin", dtResposta: "2018", total: 2}
2: {deTipoAtendimento: "012", nmAssunto: "Assunto Novo 012", nmUsuario: "Administrador", dtResposta: "2018", total: 1}
3: {deTipoAtendimento: "012", nmAssunto: "Assunto Novo 012", nmUsuario: "Administrador IMB", dtResposta: "2018", total: 3}
4: {deTipoAtendimento: "012", nmAssunto: "Assunto Teste GREAt", nmUsuario: "Administrador IMB", dtResposta: "2018", total: 2}
5: {deTipoAtendimento: "012", nmAssunto: "Thais 23042018", nmUsuario: "Administrador IMB", dtResposta: "2018", total: 2}
6: {deTipoAtendimento: "012", nmAssunto: "teste Alterado2", nmUsuario: "Administrador IMB", dtResposta: "2018", total: 1}

这会返回以下数组:

0: {nmUsuario: "15", listNmAssunto: Array(1), listDtResposta: Array(1), $$hashKey: "object:2975"}
1: {nmUsuario: "Admin", listNmAssunto: Array(1), listDtResposta: Array(1), $$hashKey: "object:2976"}
2: {nmUsuario: "Administrador", listNmAssunto: Array(1), listDtResposta: Array(1), $$hashKey: "object:2977"}
3: {nmUsuario: "Administrador IMB", listNmAssunto: Array(4), listDtResposta: Array(4), $$hashKey: "object:2978"}

我的问题是如何在映射时将 nmSubject 和 dtResponse 插入同一个数组中

【问题讨论】:

  • 你能添加你想要的最终数组的样子吗?
  • @MattWay 直到现在他们是这样的:listNmAssunto: ["Cartão extraviado"] 和 `listDtResposta: ["2018"]` 但我需要这样的东西:listAssunto: [{a: "Cartão extraviado", b: "2018"}, {...},{...}] 谢谢帮助
  • 我已经尝试回答您的要求,但正如我在电话上写的那样,未经验证。也许你必须为对象调整你的 removeDuplicates 函数。

标签: javascript angularjs filter foreach


【解决方案1】:

为什么不映射到一个对象? 像这样:

          $scope.listDeColaboradoresObject.forEach(item => {
        item.listAssunto = $scope.relatorioTotalMensagensRespondidasColab
          .filter(x => x.nmUsuario == item.nmUsuario)
          .map(x => {a:x.nmAssunto,b: x.dtResposta});
        item.listNmAssunto = $scope.removeDuplicates(item.listAssunto);

      });

【讨论】:

  • 简单实用
  • 如果您需要同时使用过滤器和映射(2 次迭代),也许您应该尝试减少。您可以在 reduce 函数内部检查条件并返回您想要的任何内容。
  • @OscarLópez 我会研究并扩展我的答案。
  • @OscarLópez 我认为 Matt Way 已经用 reduce 给出了答案,但对我来说 filter 和 map 可读性更好。
  • @Nikolaus 我以前也是这么想的,但是只要我一点额外的努力去理解(一点点),你就可以避免两次迭代。您还可以使用内部 if 和 check 制作经典的 for 循环。
【解决方案2】:

您的代码只会更新现有数组。我不确定它如何创建您发布的输出。但是,查看您的输出,我假设您要基于 nmUsuario 进行分组并创建一个具有 2 个数组属性的对象数组。您可以使用reducedestructiringObject.values 执行以下操作

const input = [{deTipoAtendimento:"012",nmAssunto:"Cartão extraviado",nmUsuario:"15",dtResposta:"2018",total:1},{deTipoAtendimento:"012",nmAssunto:"Assunto Novo 012",nmUsuario:"Admin",dtResposta:"2018",total:2},{deTipoAtendimento:"012",nmAssunto:"Assunto Novo 012",nmUsuario:"Administrador",dtResposta:"2018",total:1},{deTipoAtendimento:"012",nmAssunto:"Assunto Novo 012",nmUsuario:"Administrador IMB",dtResposta:"2018",total:3},{deTipoAtendimento:"012",nmAssunto:"Assunto Teste GREAt",nmUsuario:"Administrador IMB",dtResposta:"2018",total:2},{deTipoAtendimento:"012",nmAssunto:"Thais 23042018",nmUsuario:"Administrador IMB",dtResposta:"2018",total:2},{deTipoAtendimento:"012",nmAssunto:"teste Alterado2",nmUsuario:"Administrador IMB",dtResposta:"2018",total:1}]

const merged = input.reduce((r,{ nmUsuario, nmAssunto, dtResposta }) => {
  r[nmUsuario] = r[nmUsuario] || {nmUsuario, listNmAssunto: [], listDtResposta:[]};
  r[nmUsuario].listNmAssunto.push(nmAssunto);
  r[nmUsuario].listDtResposta.push(dtResposta);
  return r;
},{})

const output = Object.values(merged);
console.log(output)

【讨论】:

    【解决方案3】:

    根据您的结果评论,您似乎希望按nmUsuario 对列表进行分组,但创建一个包含相关nmAssuntodtResposta 的对象数组。您可以使用reduce() 实现此目的。基本上,您为每个nmAssunto 创建一个带有空数组的对象,并在每次迭代时将一个新对象推送到正确的数组中。然后使用Object.values()转换成最终的输出数组。

    const data = [
      {deTipoAtendimento:"012",nmAssunto:"Cartão extraviado",nmUsuario:"15",dtResposta:"2018",total:1},
      {deTipoAtendimento:"012",nmAssunto:"Assunto Novo 012",nmUsuario:"Admin",dtResposta:"2018",total:2},
      {deTipoAtendimento:"012",nmAssunto:"Assunto Novo 012",nmUsuario:"Administrador",dtResposta:"2018",total:1},{deTipoAtendimento:"012",nmAssunto:"Assunto Novo 012",nmUsuario:"Administrador IMB",dtResposta:"2018",total:3},
      {deTipoAtendimento:"012",nmAssunto:"Assunto Teste GREAt",nmUsuario:"Administrador IMB",dtResposta:"2018",total:2},
      {deTipoAtendimento:"012",nmAssunto:"Thais 23042018",nmUsuario:"Administrador IMB",dtResposta:"2018",total:2},
      {deTipoAtendimento:"012",nmAssunto:"teste Alterado2",nmUsuario:"Administrador IMB",dtResposta:"2018",total:1}
    ]
    
    const groups = data.reduce((r, { nmUsuario, nmAssunto, dtResposta }) => {
      r[nmUsuario] = r[nmUsuario] || {
        nmUsuario,
        listAssunto: []
      }
      r[nmUsuario].listAssunto.push({
        a: nmAssunto,
        b: dtResposta
      })
      return r
    }, {})
     
    console.log(Object.values(groups))

    【讨论】:

      猜你喜欢
      • 2012-07-07
      • 2023-03-23
      • 1970-01-01
      • 1970-01-01
      • 2019-02-27
      • 1970-01-01
      • 2018-08-19
      • 1970-01-01
      • 2017-08-19
      相关资源
      最近更新 更多