【问题标题】:Why are the objects in setData not as array in data?为什么 setData 中的对象不是数据中的数组?
【发布时间】:2019-10-25 14:23:33
【问题描述】:
 const [ data, setData ] = useState( [] );

useEffect( () => {
        axios( {
            method: "GET",
            url: "https://bouvet.guru/rekrytering_flera.php"
        } ).then( ( response ) => {
            if ( response.data.indexOf( "https://" ) !== -1 ) {
                let splittedArray = response.data.split( "Data:" );
                let dataString = splittedArray[1];

                if ( dataString.includes( "<URL kommentar>" ) ) {

                    let onlyData = dataString.substring( 16 );
                    let pairedData = onlyData.split( "https://" );
                    pairedData.splice( 0, 1 );

                    pairedData.map( ( group ) => {
                        let urls = group.split( " " )[0];
                        const comments = group.replace( urls, " " );

                        setData( {
                            item: {
                                url: "https://" + urls,
                                comment: comments
                            }
                        } );
                    } );
                } else {
                    console.log( "NOPE" );
                }
            } else {
                console.log( "We could not find any data" );
            }
        } );
    }, [] );

我有这个代码。

我想要什么:data = [obj1, obj2, obj3]。

我得到:数据 = obj1、obj2、obj3。

我希望对象位于数据数组中,但此刻,数据变成了一个对象。所以当我 console.log(data) 我得到 3 个单独的对象。我希望数据是一个数组,里面有这 3 个单独的对象。

【问题讨论】:

    标签: javascript reactjs


    【解决方案1】:

    因为您正在将数据设置为对象。而是将其设置为数组并使用扩展运算符[...someArray] 以避免直接状态突变:

    const urls = group.split( " " )[0];
    const comments = group.replace( urls, " " );
    const newObj = { url: "https://" + urls , comment: comments }
    setData([...data, newObj])
    

    更好的方法是不要在循环中设置状态(因为每次您在循环中设置数据时,您的组件都会重新渲染,而是构建一个 newState,然后在循环之后设置它:

    const newArray = pairedData.map( ( group ) => {
        const urls = group.split( " " )[0];
        const comments = group.replace( urls, " " );
        return { url: "https://" + urls , comment: comments }
    });
    setData([...data, ...newArray])
    

    同样使用map()而不使用它的数组或者每个返回值都是一个反模式:

    由于 map 构建了一个新数组,因此在您不使用时使用它 返回的数组是反模式;使用 forEach 或 for-of 代替。 您不应该使用地图的标志:

    A) 你没有使用它返回的数组,和/或

    B) 你没有从回调中返回值。

    Mozilla docs

    【讨论】:

    • 嗯,现在我得到了 3 个不同的数组,里面有 1 个对象,而不是 1 个数组,里面有 3 个对象
    • 确保您在第一个示例中使用[...data, newObj],在第二个示例中使用[...data,...newArray]。如果您不包含...s(扩展运算符),它将按照您在此处的评论中所说的那样执行。
    • 非常感谢!这解决了它(第二个选项)。现在我对它为什么这样做有了更多了解,它会在循环期间更新等。我会支持你的回答,再次感谢你
    猜你喜欢
    • 2011-03-15
    • 2014-10-09
    • 1970-01-01
    • 2011-10-06
    • 1970-01-01
    • 1970-01-01
    • 2017-10-13
    • 2020-08-10
    • 1970-01-01
    相关资源
    最近更新 更多