【问题标题】:How do I render this map?如何渲染这张地图?
【发布时间】:2019-08-12 16:53:57
【问题描述】:
let array = this.props.data.allGoogleSheetSpacesRow.edges;

    const results = [...array.reduce((r, e) => {
      let k = `${e.node.twitter}`;
      if(!r.has(k)) r.set(k, {...e, count: 1})
      else r.get(k).count++
      return r;
    }, new Map)]

我正在使用 reduce 来计算数组中重复的 twitter 用户名的数量,以创建如下所示的排行榜:

  1. 推特用户名:5
  2. 推特用户名:4
  3. 推特用户名:2
let leaderboard = results;
console.log(leaderboard);

return (
        {leaderboard.map((item, index) => (
          <div key={index}>
            {item.value.map((c, i) => (
              <div key={i}>
                <h3>{c.count}</h3>
                <h3>{c.node.twitter}</h3>
                <hr />
              </div>
            ))}
          </div>
        ))}

    )

我正在尝试在地图上进行映射以呈现数据,但我不知道该怎么做。我得到Cannot read property 'map' of undefined。我做错了什么?

以下是map 的细分:

所以树似乎去 array --> array --> object 但我不确定我需要做什么来渲染它。

【问题讨论】:

    标签: javascript arrays reactjs gatsby array.prototype.map


    【解决方案1】:

    首先,请查看Map 的文档。请注意,可用的方法包括entrieskeysvaluesforEach。没有 map 方法(尽管有人认为应该有)。

    还要注意 map 是可迭代的,因此您可以执行 for (let [key, value] of map){…}(这与调用 .forEach(…).entries().forEach(…) 几乎相同)。

    不过,您可能想要的是Array.from(map.entries()).map(…)[...map.entries()].map(…).entries()返回一个[key, value]对的map迭代器,可以转换成数组,里面有.map(…)方法。

    所以你的代码非常接近:

      return (
            <div>{Array.from(leaderboard.entries()).map(([key, value]) => (
              <div key={key}>
                  <div>
                    <h3>{value.count}</h3>
                    <h3>{value.node.twitter}</h3>
                    <hr />
                  </div>
              </div>
            ))}</div>
        )
    

    【讨论】:

    • 知道为什么我会收到leaderboard.entries(...).map is not a function吗?
    • 嗯,您使用的是什么版本的 javascript/浏览器(或者您使用 babel 转译到什么版本)?因为看起来您没有将地图作为结果中的值,而是将地图作为第一个值的数组。试试console.log(leaderboard instanceof Array)console.log(leaderboard instanceof Map)
    • 此外,如果您想继续使用映射而不是将其转换为数组,您可能希望从您的 reduce 调用中删除 [...][...map] 几乎等同于在足够新的 javascript 版本中调用 map.entries()。 (这可能是你的意图......)
    • 我正在使用 Gatsby 的 .babelrc 文件,我认为它与当前版本的 React 相同。对于 Array 的实例,clg 返回 false,对于 Map 的实例返回 true。当我 console.log(leaderboard.entries()) 它返回 MapIterator {"mmckvr" =&gt; {…}, "shylands" =&gt; {…}, "null" =&gt; {…}, "mccrum" =&gt; {…}, "barrymcgee" =&gt; {…}, …} __proto__: Map Iterator [[IteratorHasMore]]: true [[IteratorIndex]]: 0 [[IteratorKind]]: "entries" [[Entries]]: Array(8) 0: {"mmckvr" =&gt; Object} ... length: 8 不知道为什么它不工作
    • 哦,嗯...我确定条目是一个数组,但不,它是一个映射迭代器,它没有map 方法。好吧,Array.from(…)[...map] 应该可以解决这个问题...
    【解决方案2】:

    您可以遍历 Map 的键:

    return (
            {[...leaderboard.keys()].map(key => (
              <div key={key}>
                    <h3>{leaderboard.get(key).count}</h3>
                    <h3>{leaderboard.get(key).node.twitter}</h3>
              </div>
            ))}
    );
    

    查看此代码框:https://codesandbox.io/s/o4v0695n5q

    【讨论】:

    • 嗯,当我尝试这样做时,我得到了leaderboard.get() is not a function。任何想法为什么?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-05
    相关资源
    最近更新 更多