在多次嵌套对象上使用 ES6 .map() 以获取反应组件

Posted

技术标签:

【中文标题】在多次嵌套对象上使用 ES6 .map() 以获取反应组件【英文标题】:use ES6 .map() on multiple times nested objects for react components 【发布时间】:2020-07-03 19:48:30 【问题描述】:

如何使用.map() 遍历this object

state =  
      contacts: [
         "id":1,
           "name":"Leanne Graham",
           "email":"Sincere@april.biz",
           "address":
              "street":"Kulas Light",
              "city":"Gwenborough",
              "geo":
                 "lat":"-37.3159",
                 "lng":"81.1496"
              
           ,
           "phone":"1-770-736-8031",
        ,
         "id":2,
           "name":"Ervin Howell",
           "email":"Shanna@melissa.tv",
           "address":
              "street":"Victor Plains",
              "city":"Wisokyburgh",
              "geo":
                 "lat":"-43.9509",
                 "lng":"-34.4618"
              
           ,
           "phone":"010-692-6593",
        
     ]
    

所以映射联系人将起作用,因为它是一个数组,所有数据(如 id、姓名、电子邮件和电话)都是可访问的,但如果我想遍历地址,则会崩溃。我使用了一些示例,例如:

render()
  const contacts = this.state
  return(
    <>
       Object.keys(contacts.address).map((address, index) => (
          <span className="d-block" key=index>contacts.address[address]</span>
        ))
    </>
  );

它应该与地址一起使用,但在地理上崩溃了,此时我已经失去了信号。

谁能给我一个ideea?

【问题讨论】:

在地理情况下您希望输出如何? @Supercool 我认为只要显示它们就没有关系 【参考方案1】:

我不认为是问题,只要它显示它们

映射contacts 后,您可以随意添加地址属性:

const contacts = [
  
    id: 1,
    name: "Leanne Graham",
    email: "Sincere@april.biz",
    address: 
      street: "Kulas Light",
      city: "Gwenborough",
      geo: 
        lat: "-37.3159",
        lng: "81.1496",
      ,
    ,
    phone: "1-770-736-8031",
  ,
  
    id: 2,
    name: "Ervin Howell",
    email: "Shanna@melissa.tv",
    address: 
      street: "Victor Plains",
      city: "Wisokyburgh",
      geo: 
        lat: "-43.9509",
        lng: "-34.4618",
      ,
    ,
    phone: "010-692-6593",
  ,
];

const addresses = contacts.map(( address, id ) => (
  id,
  ...address,
));

console.log(addresses);

喜欢渲染它们:

addresses.map(( street, city, id ) => (
  <span className="d-block" key=id>
    street:city
  </span>
))

【讨论】:

【参考方案2】:

您可以映射一个数组,因为您希望它在每个元素中具有一致的值,但对于 object,情况并非如此。所有的值都是不同的,具有不同的含义。此外,您的 span 将无法显示对象,它只会显示原始值,例如字符串或数字

你可以手动做你想做的事情。

const  contacts  = this.state;
return (
  <>
    contacts.map(( address , id) => 
      return (
        <React.Fragment key=id>
          <span>Street: address.street</span>
          <span>City: address.city</span>
          <span>Lat: address.geo.lat</span>
          <span>Lng: address.geo.lng</span>
        </React.Fragment>
      );
    )

如果您真的想使用循环或某种形式的迭代来实现,您可以查看Object.entries。但是,如果您不知道自己在处理什么,那么使用嵌套对象真的很难做到这一点。

contacts.map(( address ) => 
  for (let [key, value] of Object.entries(address)) 
    console.log(`$key: $value`); // logs "street: Kulas Light"
  
)

但请注意geo,如果您将其直接放入跨度中,它将给出"geo: [Object object]"

P.S 我建议为 Fragment 找到比数组索引更好的键。

【讨论】:

这对我来说看起来不错,但对我的代码不起作用:|你可以在这里添加你的例子吗? codesandbox.io/s/wonderful-mahavira-bmsqw codesandbox.io/s/sharp-noether-cr4km。在这里添加了一个解决方案,问题是我没有在元素之前添加片段。我也会更新答案。【参考方案3】:

这应该会有所帮助:

const address = contacts[0].address;

<>
  Object.keys().map((addressKey, index) => (
    <span className="d-block" key=index>
      typeof address[addressKey] === "object"
        ? Object.keys(address[addressKey]).map(e => (
            <span>address[addressKey][e]</span>
          ))
        : contacts[0].address[address]
    </span>
  ))
</>;

【讨论】:

以上是关于在多次嵌套对象上使用 ES6 .map() 以获取反应组件的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript 的对象加强 Map()

JavaScript 的对象加强 Map()

js es6 map 与 原生对象区别

ES6学习小结6:何为Map?

解构时可空嵌套对象上的 ES6 默认参数

你啥时候会在对象上使用 ES6 映射? [复制]