javascript - map 不输出任何东西,没有错误信息

标签 javascript reactjs

我有一个小应用程序,它从文本区域获取输入并将其与 JSON 文件进行匹配,目的是仅显示与文本区域的输入相匹配的 JSON 数据。

MakeList 功能运行良好(尽管在单击“输出 JSON”按钮两次之前它不起作用,如果有人能帮助我理解它会是一个奖励!)。我可以让该函数中的 map 在沿着数组向下移动时创建文本节点,但我想以 React 方式进行。但是,#results-area 中的 map 没有做任何事情,我不确定为什么。没有错误消息。

import React, {useState} from 'react';

let cardMasterList = require('./scryfall-oracle-cards.json')

function CardFinder() {

    let [listEntries, setListEntries] = useState([])

    function MakeList(e) {
        e.preventDefault()
        setListEntries(document.querySelector('#entry-textarea').value.split('\n').sort())
        listEntries.map((theCard,cardItem) => {
            cardMasterList
                .filter(({name}) => name === theCard)
                .map((cardNameMap) => {
                    let cardData = JSON.stringify(cardNameMap)
                    console.log(cardData)
                    document.querySelector('#json-output').innerHTML = JSON.stringify(cardNameMap)
                })
        })
    }

    function DontDoIt(e) {
        e.preventDefault()
    }

    return(
        <section id="card-finder-output">

            <form id="entry-form" onSubmit={() => {DontDoIt()}}>
                <textarea id="entry-textarea"></textarea>
                <button className="astbutton" onClick={MakeList}>Output JSON</button>
            </form>

            <aside id="results-area">
            {
                listEntries.map((theCard,cardItem) => {
                    cardMasterList
                        .filter(({name}) => name === theCard)
                        .map((cardNameMap) => {
                            return(<span key={cardItem}>{JSON.stringify(cardNameMap)}</span>)
                        })
                })
            }
            </aside>

            <aside id="json-output"></aside>
        </section>
    )

}

export default CardFinder

一旦我有了输出,我打算将它复制到一个文本文件并暂时将其用作数据库 - 但稍后我将尝试使用实际的数据库。

最佳答案

这里:

                listEntries.map((theCard,cardItem) => {
                    cardMasterList
                        .filter(({name}) => name === theCard)
                        .map((cardNameMap) => {
                            return(<span key={cardItem}>{JSON.stringify(cardNameMap)}</span>)
                        })
                })

我想你想要:

                listEntries.map((theCard,cardItem) => (
                    cardMasterList
                        .filter(({name}) => name === theCard)
                        .map((cardNameMap) => {
                            return(<span key={cardItem}>{JSON.stringify(cardNameMap)}</span>)
                        })
                ))

或者:

                listEntries.map((theCard,cardItem) => {
                    return cardMasterList
                        .filter(({name}) => name === theCard)
                        .map((cardNameMap) => {
                            return(<span key={cardItem}>{JSON.stringify(cardNameMap)}</span>)
                        });
                })

第一个创建 cardMasterList 的过滤映射,但随后将其丢弃。后两者返回一个过滤、转换的 cardMasterList(生成一些 HTML),这看起来像您想要的。

我不确定这是否是唯一的问题,因为它还取决于数据的形状。

我还建议做一些额外的验证(通过 prop 类型或自己动手)和可能的单元测试来检查像这样的复杂映射/过滤的行为。如果您在一开始编写代码时就这样做,您可能会避免一些错误,并且更容易通过逻辑进行推理(现在和重新访问它时,可能比您预期的要晚得多)。

关于javascript - map 不输出任何东西,没有错误信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56117758/

相关文章:

javascript - 将片段标识符放入查询参数内

javascript - 为什么 Angular Controller 需要 "$scope"

reactjs - 使用 .NET Core Web API 和 React 进行 Active Directory 身份验证

javascript - 来自 GitHub 页面的 API 请求不起作用 ("mixed block")

javascript - '../js/vue' 和 'test/data/js/vue.js' 有什么区别?

javascript - 如何在多个预先声明的 jQuery 对象上绑定(bind) jQuery 事件

javascript - 为什么 stringify 的 moment.js 日期在解析时返回不同的值

javascript - React-Slick 不适用于 React 中的首次渲染

javascript - setState 方法中的 React 16 计数器值在下一个列表项中传播

javascript - ReactJS:如何在 JavaScript 中过滤数组以在 map 上显示特定图像