reactjs 如何将两个相似的对象数组组合为一个数组对象?

ewm0tg9j  于 2022-11-22  发布在  React
关注(0)|答案(2)|浏览(152)

我很抱歉,如果我问了一个以前被问过的问题,我很难用词表达这个问题。
基本上,我的API返回一个对象数组,这些对象

const response.survey = [
  {
    1: { id: 1, user: user_1, points: 5 },
    2: { id: 2, user: user_2, points: 3 }...
  }
],
[
  {
    1: { id: 1, user: user_1, points: 10 },
    2: { id: 2, user: user_2, points: 0 }...
  }
],...

根据用户通过我们的表单提交的内容,这可能会持续数百个数组。我一直在思考如何将它们组合成类似以下的内容:

[
  { user: user_1, points: 15 },
  { user: user_2, points: 3 },...
]

请注意,从API返回的数据具有对象的键,如Array[Object[1]]、Array[Object[2]]等。
在我当前的开发环境中,我返回了2x个包含25个数据点的集合,因此我希望最终的对象数组的索引为25,但现在我得到了52。我相信有一个更短的方法来处理这个问题,但我不能完全理解它,我一直在兜圈子。
以下是我尝试过的方法:

let newArr = [];
response.survey.map((ballot, i) => {
    for (const key in ballot) {
        if (newArr.length == 0) {
            let newObj = {
                name: pos[key].user,
                points: pos[key].points
            }
            newArr.push(newObj);
        } else {
            for (let k = 0; k < newArr.length; k++) {
                if (newArr[k].name === pos[key].name) {
                    newArr[k].points += pos[key].points;
                } else {
                    if (k + 1 == newArr.length) {
                        let newObj = {
                            name: pos[key].name,
                            points: pos[key].points
                        }
                        newArr.push(newObj);
                    }
                }
            }
        }
    }
}

我想我已经在这个问题上工作了这么长时间,我已经开始进入圈子,并走向错误的道路。
任何帮助都将不胜感激。

xytpbqjk

xytpbqjk1#

以下是一个可行的解决方案:

const response = [
  [
  {
    1: { id: 1, user: "user_1", points: 5 },
    2: { id: 2, user: "user_2", points: 3 },
  }
],
[
  {
    1: { id: 1, user: "user_1", points: 10 },
    2: { id: 2, user: "user_2", points: 0 },
  }
]
]

const newArr = [];

for(let index in response){
  const object = response[index][0]
  for(let index2 in object){
    const index = newArr.findIndex(val => val.user === object[index2].user)
    if(index >= 0){
      newArr[index].points += object[index2].points;

    }else{
      newArr.push({user:object[index2].user, points: object[index2].points })
    }
  }
}
p5cysglq

p5cysglq2#

这解决了我的问题

await fetch('/api/getBallots')
            .then((response) => response.json())
            .then(async (data) => {
                let newArray = []

                data.ballots.map((ballot, i) => {
                    for (const key in ballot) {
                        if(!ballot[key].name) {
                            return;
                        } else {
                            let newObj = {
                                name: ballot[key].name,
                                points: ballot[key].points
                            }
                            newArray.push(newObj);
                        }
                        
                    }
                });
                let rankings = []; 
                for (let i = 0; i < newArray.length; i++) {
                    if (rankings.length == 0) {
                        rankings.push({
                            name: newArray[i].name,
                            points: newArray[i].points
                        });
                    } else {
                        const index = rankings.findIndex((item) => item.name == newArray[i].name);
                        if (index == -1) {
                            rankings.push({
                                name: newArray[i].name,
                                points: newArray[i].points
                            })
                        } else {
                            rankings[index].points += newArray[i].points;
                        }
                    }
                }          
        })

相关问题