展平太多可观察的嵌套对象

flatten too many nested object observable

我有一个对象,其中包含几层需要展平的嵌套集合属性。这是我的观察结果:

const source1$ = of(
  {
    code: '00a',
    data: [
      {
        id: 1,
        name: 'jon',
        jobs: [
          {
            name: 'developer',
            level: [
              1
            ]
          }
        ]
      },
      {
        id: 2,
        name: 'smith',
        jobs: [
          {
            name: 'driver',
            level: [
              2, 3
            ]
          }
        ]
      },
    ]
  });

现在我想在 rxjs 运算符的帮助下变成像下面的对象。我尝试用 map,reduce,pluck 来做,但无法达到目标。

{
  code: '00a',
  data: [
      {
        id: 1,
        name: 'jon',
        jobs: 'developer(1)'

      },
      {
        id: 2,
        name: 'smith',
        jobs: 'driver(2,3)'
      }
    ]
}

看起来你想要这样的东西:

source1$.pipe(
  map(v => ({
    ...v,
   data: v.data.map(d => ({
      ...d,
      jobs: d.jobs.map(j => `${j.name}(${j.level.join()})`).join('-')
    }))
  }))
)

附带说明: 如果您的应用程序像这样进行大量嵌套对象更新,请查看为您实现镜头的库。他们让这一切变得更好。


更新:

这是做类似事情的另一种可能方法。在这里,您改变了所有常见警告附带的数据。

source1$.pipe(
  map(v => {
    v.data.forEach(d => 
      d.jobs = d.jobs
        .map(j => `${j.name}(${j.level.join()})`)
        .join('-')
    );
    return v;
  })
);

我是这样做的,正在寻找更好的解决方案

    source1$
  .pipe(
    map(v =>
    ({
      ...v,
      data: v.data.map(x =>
      ({
        ...x,
        jobs: x.jobs.map(j =>
          `${j.name}(${j.level.join()})`
        ).join('-')
      })
      )
    })
    )
  )
  .subscribe(console.log)