将数组映射到对象数组

Mapping array to array of objects

我得到了一组这样的对象:

const defaultActors = 
[
  {
   data: {name: "name1"}
  },
  {
   data: {name: "name2"}
  }
]

和一个像这样的简单数组:

   const actorsToBeAdded = ["nameX", "nameY"]

有没有简单的方法可以得到这个:

 const combinedActors =  [
      {
       data: {name: "name1"}
      },
      {
       data: {name: "name2"}
      },
      {
       data: {name: "nameX"} //newly added
      },
      {
       data: {name: "nameY"} //newly added
      }
    ]

我正在使用 useState 并尝试像这样获取对象的组合数组:

    setCombinedActors(
    actorsToBeAdded.map((actor) => 
      ({
        data: {name : actor} //data from [nameX, nameY] array
        //also need to spread data from {name: "name1" ...} array
       })
     )
   )

编辑:感谢您的回答。 Concat 确实会产生一个数组,但它是“直接”值和对象的数组,就像这样

["name1", "name2", {Object_with_data},{Object_with_data}]

有没有办法得到

[{Object_with_data},{Object_with_data}, {Object_with_data},{Object_with_data}]

或这个

["name1", "name2", "name3", "name4"]

? 我创建了沙箱: https://codesandbox.io/s/epic-taussig-zeyev?file=/src/App.js

感谢有兴趣的人!

actorsToBeAdded.forEach(value=>{
defaultActors.push(
              {data:{name:value}},
              );
}
)

试试这个。

您可以使用 Array.prototype.concat 连接两个数组,例如:

setCombinedActors(
    defaultActors.concat(
        actorsToBeAdded.map(actor => ({ data: { name : actor } }))
    )    
)

此外,您可能只想添加仍不在 defaultActors 数组中的演员,为此您可以使用像这样的过滤器:

setCombinedActors(
    defaultActors.concat(
        actorsToBeAdded
            .filter(actor => !defaultActors.some(({ data }) => data.name === actor))
            .map(actor => ({ data: { name : actor } }))
    )    
)

如果您想全部转换为String,正在回答编辑。

arr.map(elm => typeof elm === 'string' ? elm : elm.data.name)

否则,如果你想要对象。

arr.map(elm => typeof elm === 'string' ? { data: { name: elm } } : elm)

注意:假设数组的所有元素都是 String 或结构为 { data: { name: 'a string' } }.

的对象