【问题标题】:Creating new array with corresponding values创建具有相应值的新数组
【发布时间】:2022-07-01 19:38:45
【问题描述】:

我有两个数组,一个带有 react-icon 组件 -

const amenities = [
  {
    id: 1,
    name: "Wifi",
    icon: <FaWifi />
  },
  {
    id: 2,
    name: "Kitchen",
    icon: <FaUtensils />
  },
  {
    id: 3,
    name: "Shower",
    icon: <FaShower />
  },
  {
    id: 4,
    name: "Bath",
    icon: <FaBath />
  },
  {
    id: 5,
    name: "Disabled Access",
    icon: <FaWheelchair />
  },
  {
    id: 6,
    name: "Lift",
    icon: <GrElevator />
  },
  {
    id: 7,
    name: "Air Con",
    icon: <TiWeatherSnow />
  },
  {
    id: 8,
    name: "Downtown",
    icon: <FaCity />
  },
  {
    id: 9,
    name: "Coffee Maker",
    icon: <FaCoffee />
  },
  {
    id: 10,
    name: "Public Transport",
    icon: <FaSubway />
  },
  {
    id: 11,
    name: "Landmarks",
    icon: <FaToriiGate />
  },
  {
    id: 12,
    name: "Nice Scenery",
    icon: <FaImage />
  },
]

一个没有图标属性的后端来自没有图标属性

chosenAmenities: [
    { name: 'Wifi', id: 1 },
    { id: 3, name: 'Shower' },
    { name: 'Air Con', id: 7 }
  ]

我想知道如何创建一个新数组,根据 selectedAmenities 数组中存在的值添加正确的 react-icon 组件属性?

我已经能够像这样成功地添加一个“测试”值......

const updatedAmenitites = amenities.map(obj =&gt; ({...obj, test: "test"}));

但是,我正在努力弄清楚如何将其作为最终产品显示在前端:

updatedAmenities: [
        { name: 'Wifi', id: 1, icon: <FaWifi /> },
        { id: 3, name: 'Shower', icon: <FaShower /> },
        { name: 'Air Con', id: 7, icon: <TiWeatherSnow /> }
      ]

我正在使用带有 React 的 Next.js,并从 firebase 获取作为上下文的后端。

谢谢!

【问题讨论】:

  • 名称和图标组件之间有什么映射关系吗?
  • 映射对象时,可以使用 if 语句,如果 name 是特定值,则添加相应的 icon。或者,您可以创建一个查找对象,例如:{"Wifi": &lt;FaWifi /&gt;, "Shower": &lt;FaShower /&gt;, ...},如果这样做,您可以使用.name 属性来获取相应的图标。如果您已经有此查找,您可能会发现甚至不需要添加 icon 属性
  • 我看不出输入、输出有什么区别

标签: javascript reactjs next.js


【解决方案1】:

您可以只使用 chosenAmenities 中的 id 属性进行映射。

const amenities = [
  {
    id: 1,
    name: "Wifi",
    icon: <FaWifi />,
  },
  {
    id: 2,
    name: "Kitchen",
    icon: <FaUtensils />,
  },
];

const chosenAmenities = [
  { name: "Wifi", id: 1 },
  { id: 3, name: "Shower" },
  { name: "Air Con", id: 7 },
];

const updatedAmenities = chosenAmenities.map((e) => {
 const amenity = amenities.find((i) => i.id === e.id);
 if(!amenity) return e;
 return ({
  ...e,
  icon: amenity.icon,
 });
});

参考文献

【讨论】:

  • 这很接近,但它为我提供了嵌套在 icon 属性中的设施的完整对象——而不是仅仅获取孤立的 icon 属性并将其放入 updatedAmenitites 的正确对象中
  • 这是一张图片imgur.com/LobjuiV
  • 编辑了答案
  • 这行得通 - 非常感谢你的帮助,你是一个美丽的人 :)
  • 谢谢,请点赞和accept it
【解决方案2】:

您可以使用new Set 创建一个hashMap,然后通过便利设施使用.filter

const amenities = [{ id: 1,name: "Wifi",icon: '<FaWifi />'},{id: 2,name: "Kitchen",icon: '<FaUtensils />'},{id: 3,name: "Shower",icon: '<FaShower />' },{id: 4,name: "Bath",icon: '<FaBath />'},{id: 5,name: "Disabled Access",icon: '<FaWheelchair />'},{id: 6,name: "Lift", icon: '<GrElevator />'},{
id: 7,name: "Air Con",icon: '<TiWeatherSnow />'},{id: 8,name: "Downtown", icon: ' <FaCity />'},{id: 9,name: "Coffee Maker",icon: '<FaCoffee />'},{id:10, name: "Public Transport", icon: '<FaSubway />'},{id: 11,name: "Landmarks",icon: '<FaToriiGate />'},{id: 12,name: "Nice Scenery",icon: '<FaImage />' },]


const chosenAmenities = [
    { name: 'Wifi', id: 1 },
    { name: 'Shower', id: 3, },
    { name: 'Air Con', id: 7 }
 ];
  
const hashMap = new Set((chosenAmenities).map(({ id }) => id));
const result = amenities.filter(({id}) => hashMap.has(id));

console.log(result);

【讨论】:

    【解决方案3】:

    您可以使用 Array.find() 并通过 Id 搜索相关对象

    const updatedAmenitites = chosenAmenities.map(ca=> amenities.find(a=>a.id===ca.id))
    

    【讨论】:

      【解决方案4】:

      按照您的路线,这是另一种解决方案

      const updatedAmenitites = chosenAmenities.map(obj => {
        ...obj,
        icon: amenities[amenities.findIndex(a => a.id === obj.id)].icon
      })

      【讨论】:

      • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
      猜你喜欢
      • 2020-11-15
      • 1970-01-01
      • 2016-07-29
      • 2021-12-10
      • 2011-08-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-26
      相关资源
      最近更新 更多