【问题标题】:Return objects from a map function if true如果为真,则从地图函数返回对象
【发布时间】:2021-12-03 20:04:42
【问题描述】:

只有在检查了文档时,我才想从地图函数中返回对象。这是我的状态的结构。

    {
        type: ListOfTypes[Math.floor(Math.random() * ListOfTypes.length)],
        name: ListOfNames[Math.floor(Math.random() * ListOfNames.length)],
        id: nanoid(),
        channels: [
            {
                id: nanoid(),
                Name: ListOfChannels[Math.floor(Math.random() * ListOfChannels.length)],
                Files: [
                    { folder: "Folder", id: nanoid(), documents: [{ doc: "WordDoc1.doc", isChecked: false, id: nanoid() }, { doc: "WordDoc2.doc", isChecked: false, id: nanoid() }, { doc: "WordDoc3.doc", isChecked: false, id: nanoid() }, { doc: "WordDoc4.doc", isChecked: false, id: nanoid() }] },
                    { folder: "Folder", id: nanoid(), documents: [{ doc: "WordDoc1.doc", isChecked: false, id: nanoid() }, { doc: "WordDoc2.doc", isChecked: false, id: nanoid() }, { doc: "WordDoc3.doc", isChecked: false, id: nanoid() }, { doc: "WordDoc4.doc", isChecked: false, id: nanoid() }] },
                    { folder: "Folder", id: nanoid(), documents: [{ doc: "WordDoc1.doc", isChecked: false, id: nanoid() }, { doc: "WordDoc2.doc", isChecked: false, id: nanoid() }, { doc: "WordDoc3.doc", isChecked: false, id: nanoid() }, { doc: "WordDoc4.doc", isChecked: false, id: nanoid() }] },],
            },
            {
                id: nanoid(),
                Name: ListOfChannels[Math.floor(Math.random() * ListOfChannels.length)],
                Files: [
                    { folder: "Folder", id: nanoid(), documents: [{ doc: "WordDoc1.doc", isChecked: false, id: nanoid() }, { doc: "WordDoc2.doc", isChecked: false, id: nanoid() }, { doc: "WordDoc3.doc", isChecked: false, id: nanoid() }, { doc: "WordDoc4.doc", isChecked: false, id: nanoid() }] },
                    { folder: "Folder", id: nanoid(), documents: [{ doc: "WordDoc1.doc", isChecked: false, id: nanoid() }, { doc: "WordDoc2.doc", isChecked: false, id: nanoid() }, { doc: "WordDoc3.doc", isChecked: false, id: nanoid() }, { doc: "WordDoc4.doc", isChecked: false, id: nanoid() }] },
                    { folder: "Folder", id: nanoid(), documents: [{ doc: "WordDoc1.doc", isChecked: false, id: nanoid() }, { doc: "WordDoc2.doc", isChecked: false, id: nanoid() }, { doc: "WordDoc3.doc", isChecked: false, id: nanoid() }, { doc: "WordDoc4.doc", isChecked: false, id: nanoid() }] },
                ],
            },
            {
                id: nanoid(),
                Name: ListOfChannels[Math.floor(Math.random() * ListOfChannels.length)],
                Files: [
                    { folder: "Folder", id: nanoid(), documents: [{ doc: "WordDoc1.doc", isChecked: false, id: nanoid() }, { doc: "WordDoc2.doc", isChecked: false, id: nanoid() }, { doc: "WordDoc3.doc", isChecked: false, id: nanoid() }, { doc: "WordDoc4.doc", isChecked: false, id: nanoid() }] },
                    { folder: "Folder", id: nanoid(), documents: [{ doc: "WordDoc1.doc", isChecked: false, id: nanoid() }, { doc: "WordDoc2.doc", isChecked: false, id: nanoid() }, { doc: "WordDoc3.doc", isChecked: false, id: nanoid() }, { doc: "WordDoc4.doc", isChecked: false, id: nanoid() }] },
                    { folder: "Folder", id: nanoid(), documents: [{ doc: "WordDoc1.doc", isChecked: false, id: nanoid() }, { doc: "WordDoc2.doc", isChecked: false, id: nanoid() }, { doc: "WordDoc3.doc", isChecked: false, id: nanoid() }, { doc: "WordDoc4.doc", isChecked: false, id: nanoid() }] },
                ],
            }
        ]
    }

我尝试通过状态数组进行映射,但我得到了一个对象,其中包含不必要的数组。

const handleMoveAll = () => {

    const CheckedDocuments = List.map( (connection: any) => (connection.id == connectionId) &&
        connection.channels.map( (channel: any) => (channel.id == channelId) &&
            channel.Files.map( (file: any) =>
                file.documents.map( (doc: any) => doc.isChecked && 
                doc
                ))

        )
    )

    console.log(CheckedDocuments)
}

有没有更好的方法来循环通过 Files 数组检查检查的文档并将它们返回到单个数组中?

【问题讨论】:

标签: reactjs setstate


【解决方案1】:

感谢@HagaiHarari 和@oakar。

const handleMoveAll = () => {

        const CheckedDocuments = List.flatMap((connection: any) => (connection.id == connectionId) ?
            connection.channels.flatMap((channel: any) => (channel.id == channelId) ?
                channel.Files.flatMap( (file: any) =>
                    file.documents.filter( (doc: any) => { if(doc.isChecked) return doc }
                    ))
                : []
            )
            : []
        )

        console.log(CheckedDocuments)
    }

【讨论】:

    猜你喜欢
    • 2021-01-12
    • 2019-04-29
    • 2019-09-28
    • 2021-08-18
    • 2017-07-28
    • 2011-02-03
    • 1970-01-01
    • 2018-01-26
    • 1970-01-01
    相关资源
    最近更新 更多