【问题标题】:Can't sort an array of object after pushing a new item into it将新项目推入对象数组后无法对对象数组进行排序
【发布时间】:2026-01-29 00:00:01
【问题描述】:

我在对 react-native 下的数组进行排序时遇到问题。

所以我有这个从 url 获取的对象数组。 每个对象看起来像这样: {id: "66", activityHash: "2814646673", hashOrigin: "activity", mapIcon: "th_cat.png", mapImage: "", …}

一旦我得到那个数组,我就会这样做: data.Response.map

在这个 array.map 中,我对每个 'activityHash' 启动一个 SQLite 查询,它返回存储在本地 SQLite 数据库中的名称。

然后我将每个项目推入一个新数组中:

item.name = parsedJson.displayProperties.name
mapDataTemp.push(item)

最后,我想根据我刚刚在上面添加的名称键对其进行排序: sortedMapData = [...mapDataTemp].sort((a, b) => {return a.name - b.name})

但除了一个条目(有 47 个)之外,我无法在屏幕上看到任何内容

我认为这是因为一旦我想对数组进行排序,array.map 进程还没有完成处理,但找不到正确的方法来纠正/解决它。 我刚开始 React-native 所以请原谅我的愚蠢问题:p

      GetArcadiaData(this.url).then(data => {

        this.setState({isLoading: false})

        data.Response.map( (item, index) => {
          if (item.hashOrigin == '111') {
            item.name = I18n.t('maps_public_event')
            mapDataTemp.push(item)
          }
          else {
            sqliteReadHash(item.hashOrigin, item.activityHash)
              .then((parsedJson) => {
                //console.log(parsedJson.displayProperties.name)
                item.name = parsedJson.displayProperties.name
                mapDataTemp.push(item)
              })
            }
        })

        console.log(mapDataTemp)
        sortedMapData = [...mapDataTemp].sort((a, b) => {return a.name - b.name})
        console.log(sortedMapData)

        this.setState({
          mapData: sortedMapData
        })

      })

GetArcadiaData 是获取原始数据的函数

sqliteReadHash是读取本地数据库并收集activityHash对应的正确名称的函数

【问题讨论】:

    标签: arrays sorting react-native


    【解决方案1】:

    您可以在下面尝试排序功能

    .sort((a,b)=> a.name.localeCompare(b.name));
    

    您正在比较字符串,所以我只是添加了 localCompare 方法来比较字符串。

    希望对你有帮助!

    【讨论】:

    • 感谢您的帮助!不幸的是结果是一样的。 console.log(mapDataTemp) 显示所有未排序的数据,console.log(sortedMapData) 只显示一行。
    【解决方案2】:

    这可能会有所帮助

    [...mapDataTemp].sort(function(a, b){
        if(a.name < b.name) { return -1; }
        if(a.name > b.name) { return 1; }
        return 0;
    })
    

    【讨论】:

    • 感谢您的帮助!不幸的是结果是一样的。 console.log(mapDataTemp) 显示所有未排序的数据,console.log(sortedMapData) 只显示一行