【问题标题】:Add additiontal values to Map value (key, value) object from RxJs observable call从 RxJs 可观察调用向 Map 值(键,值)对象添加附加值
【发布时间】:2020-03-26 13:21:11
【问题描述】:

我正在尝试将数据添加到地图 api 调用。我使用 RxJS 创建一个 observable 并希望在订阅之前添加此数据。即使之后我可以做到,这意味着我需要订阅数据,这与我对其他服务提供商的操作方式不同。

我有一个 API 调用,“site.com/api”,它具有地图数据类型。为简洁起见,我将把数据简化为重要的内容。它返回类似 Map 的格式,见下文

interface input {
  name: string;
  month: string;
  season?: string
}

data = {
  '2020-01-01': {
    name: 'test';
    month: 'Jan';
  },
  '2020-01-02': {
    name: 'hi';
    month: 'Feb';
  }
}

我想要知道如何映射它以添加季节。现在,我的代码可以正常工作,但不是为每个单独的地图元素添加季节,而是完全创建了一个新元素。

const req = this.http.get<any>('site.com/api')
      .pipe(
        map((data) => {
          // Get data keys and associated data key to be all it's current values and add season
          const transformedData = Object.keys(data).map(key => data[key] = {
            ...data,
            season: 'Summer'
          });

          return transformedData;
        }),

      );

例如

{
0: [
    '2020-01-01': {...},
    '2020-01-02': {...},
    'season': 'Summer'
  ]
1: [
  '2020-01-01': {...},
  '2020-01-02': {...},
  'season': 'Summer'
  ]
}

这很奇怪,因为我认为 map 会遍历每个元素一次,因此代码会遍历,获取第一个元素的键,然后修改它的值。

一些在线答案使用 pluck 来修改映射键值,但这意味着您知道键是什么。我的地图键是动态的,日期会改变,所以我不能使用这种方法。网上的其他例子不是 map ,只是一个数组。

编辑

预期结果

{
  '2020-01-01': {
    name: 'test';
    month: 'Jan';
    season: 'Summer';
  },
  '2020-01-02': {
    name: 'hi';
    month: 'Feb';
    season: 'Summer';
  }
}

编辑 我只是调整了其他函数以使用对象数组而不是 map 。有人可以结束这个问题吗?

【问题讨论】:

    标签: angular typescript rxjs angular9


    【解决方案1】:

    您可以使用reduce

    const data = {
      '2020-01-01': {
        name: 'test',
        month: 'Jan',
      },
      '2020-01-02': {
        name: 'hi',
        month: 'Feb',
      }
    }
    const transformedData = Object.keys(data).reduce((acc, curr) => {
      return {
        ...acc,
        [curr]: {
           ...data[curr],
           season: 'Summer',
        },
      };
    }, {});
    console.log(transformedData)

    for...in循环

    const data = {
      '2020-01-01': {
        name: 'test',
        month: 'Jan',
      },
      '2020-01-02': {
        name: 'hi',
        month: 'Feb',
      }
    }
    let transformedData = {};
    for(const item in data){
      transformedData[item] = {
        ...data[item],
        season: 'Summer',
      }
    }
    console.log(transformedData)

    【讨论】:

      【解决方案2】:

      这是一种写法,我们可以简单地使用Object.assign 将这个额外的属性应用于每个元素。下面是一个工作示例!

      var data = {
        '2020-01-01': {
          name: 'test',
          month: 'Jan',
        },
        '2020-01-02': {
          name: 'hi',
          month: 'Feb',
        }
      }
      const req = of(data)
            .pipe(
              map((data) => {
                // Get data keys and associated data key to be all it's current values and add season
                const transformedData = Object.keys(data).map(key => Object.assign(data[key], {season: 'Summer'}));
      
                return transformedData;
              }),
      
            ).subscribe((output) => console.log(output));
      

      Stackblitz example

      【讨论】:

      • @Enthu 肯定会去看看,这个问题可以关闭吗?
      • 我仍然想保留'2020-01-01'的原始密钥,您的解决方案将其删除,以我的编辑为例
      • @NeedHelp101 在地图内部做一个 lodash 克隆深度并设置为一个全局变量,在应用地图之前保持原始,您还可以将未转换的数组和转换后的数组作为数组返回或地图内的对象和订阅将获得这两个数据!
      猜你喜欢
      • 1970-01-01
      • 2022-01-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-29
      • 1970-01-01
      相关资源
      最近更新 更多