【问题标题】:Converting async responce of Array of Arrays into Object将数组数组的异步响应转换为对象
【发布时间】:2022-12-20 18:58:02
【问题描述】:

我正在尝试将从 Observable 获得的 Array of Arrays 转换为单个对象数组。这是我的代码:

    this.jobsService.jobsUpdated.pipe(
    map(
     (jobsData)=> {
      return jobsData.map(
        (job)=>{
        return  job.parts.map((part)=>{ return part })
        }
      )
     }
    )
   ).subscribe(
      (partsData)=>{
         console.log('partsdata', partsData)
      }
    );

这是我返回的数据格式:

    [
     [
       {partName:1, number:10, quantity: 100}
     ],
     [
       {partName:2, number:20, quantity: 200},
       {partName:3, number:30, quantity: 300}
     ],
     etc...
    ]

请帮助将此数据(希望在管道方法中)转换为:

    [
      {partName:1, number:10, quantity: 100},
      {partName:2, number:20, quantity: 200},
      {partName:3, number:30, quantity: 300}
    ]

【问题讨论】:

    标签: arrays angular observable data-conversion


    【解决方案1】:

    使用reduce,无需使用内部map

    为什么是reduce? - 根据多个输入生成单个输出。

    this.jobsService.jobsUpdated.pipe(
        map((jobsData)=> {
          return jobsData.reduce(
            (acc, job)=>{
              acc.push(...job.parts)
              return acc;
            }
          , [])
        })
    );
    

    或者也可以使用concat

    this.jobsService.jobsUpdated.pipe(
       (jobsData)=> jobsData.reduce(
          (acc, job)=> acc.concat(job.parts), [])
       })
    );
    

    【讨论】:

      【解决方案2】:

      如果您只想要一个平面阵列:

      this.jobsService.jobsUpdated
        .pipe(
           pluck('parts'),
           map((parts)=> parts.flat())
        )
      

      【讨论】:

      • 不确定,它如何确保仅提取 parts 属性?
      • 是的,我忘记了这个微不足道的细节,我现在添加它
      • 谢谢您的回答!我不知道采摘。我会更多地了解它。
      猜你喜欢
      • 2014-06-09
      • 1970-01-01
      • 1970-01-01
      • 2021-07-20
      • 2021-05-03
      • 2018-12-04
      • 2021-06-16
      • 1970-01-01
      相关资源
      最近更新 更多