【问题标题】:Rxjs map array of objectsRxjs 映射对象数组
【发布时间】:2021-03-09 01:46:38
【问题描述】:

我想映射对象数组 现在我有类似的东西

return this.service.post(url, payload, this.httpOptions)
    .pipe(
        map((obj: any, index) => [({
            ...obj,
            val1: obj[index].val1.id,
            val2: obj[index].val2.id
        })]
    ))

我也尝试这样做

  map((obj: any, index) => 
        {   
            const list = []
            const obj = { 
                ...obj,
                val1: obj[index].val1.id,
                val2: obj[index].val2.id
            }
            list.push(obj);
            return list;
        }

输入

 [
  {
    "val1": { "id": "USER_ID", "value": "User1" },
    "val2": { "id": "USER_ID", "value": "User2" },
    "val3": "aaa",
    "val4": "val2"
  },
  {
    "val1": { "id": "USER_ID", "value": "User3" },
    "val2": { "id": "USER_ID", "value": "User4" },
    "val3": "dds",
    "val4": "eee"
  }
]

和预期的输出

   [
    {
      "val1": "USER_ID",
      "val2": "USER_ID",
      "val3": "aaa",
      "val4": "val2"
    },
    {
      "val1": "USER_ID",
      "val2": "USER_ID",
      "val3": "dds",
      "val4": "eee"
    }
]

现在,我有一个对象数组,而不是对象数组,其中一个对象包含所有对象 我想要一个对象数组,每个对象都包含 obj 以及示例 val1 和 val2 中的映射值

【问题讨论】:

  • 从 map() 中移除 [( 和 )]
  • map((obj: any) => { ...obj, val1: obj.result.id, val2: obj.status.id })
  • 如果删除我有 { 0: {}, 1: {}, val1: '...', val2: '...' }
  • 请发布您的数据形状以供输入和所需输出。 @BeshambherChaukhwan 似乎是对的,删除 ([]) 应该可以。
  • 其实只是去掉方括号,括号还是要的。

标签: angular typescript rxjs


【解决方案1】:

由于您在响应正文数据上使用了.map(),该数据预计是一个数组,那么它的返回结果也将是一个数组,您不需要在地图回调的另一个数组中再次加入它功能。对于在响应的每个元素中添加额外键值对的第二个要求,使用扩展运算符的现有代码就可以了。试试这个来修复你的地图:

return this.service.post(url, payload, this.httpOptions)
    .pipe(
        map((obj: any) => {
          return {
            ...obj,
            val1: obj.val1?.id,
            val2: obj.val2?.id
         }
      })
   )

这将给出预期的输出

[ {key1: value, ..., val1: value, val2: value}, ... ]

查看示例代码:https://ideone.com/stVusF

【讨论】:

  • 这并不像你认为的那样做,这就是 BizzyBob 说要保留括号的原因。箭头后面的括号将箭头函数置于“语句模式”而不是“返回模式” ,所以你应该从该代码中得到语法错误。
  • 哦,是的,我忘记了。谢谢
  • 但是如果我加上return并去掉括号,那会是一样的吗?
  • 您需要添加另一组括号才能使用return
  • 嗯喜欢这个.map(a => { return { ... } })
【解决方案2】:

问题在于您的map() 运算符。它接收完整的有效载荷,而不是单个项目!所以你所说的obj 实际上是一个数组。所以你还需要在数组上使用.map()

此外,您不需要index,因为您的属性位于对象本身上。

    map(inputArray => inputArray.map(obj => ({
      ...obj,
      val1: obj.val1.id,
      val2: obj.val2.id
    })))

这是一个有效的StackBlitz

【讨论】:

    猜你喜欢
    • 2023-03-17
    • 2023-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-20
    • 2021-12-03
    • 2017-12-15
    • 1970-01-01
    相关资源
    最近更新 更多