Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/450.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 基于公共属性值合并数组_Javascript_Arrays_Object_Vue.js_Vuejs2 - Fatal编程技术网

Javascript 基于公共属性值合并数组

Javascript 基于公共属性值合并数组,javascript,arrays,object,vue.js,vuejs2,Javascript,Arrays,Object,Vue.js,Vuejs2,我正在编写一个由VueJS和ExpressionEngine支持的小应用程序,它可以显示高尔夫锦标赛排行榜。一场比赛可能需要你踢多个球场。来自数据库的数据如下所示(轮数) 问题是我需要重新构造轮次数组,使其看起来像排行榜数组。我在如何完成这一点上遇到了一些困难。任何指导都将不胜感激 rounds: [ { team: "Dropkick Murphies", score: 75, course: 17 }, { team: "Dr

我正在编写一个由VueJS和ExpressionEngine支持的小应用程序,它可以显示高尔夫锦标赛排行榜。一场比赛可能需要你踢多个球场。来自数据库的数据如下所示(轮数)

问题是我需要重新构造轮次数组,使其看起来像排行榜数组。我在如何完成这一点上遇到了一些困难。任何指导都将不胜感激

rounds: [
   {
      team: "Dropkick Murphies",
      score: 75,
      course: 17
   },
   {
      team: "Dropkick Murphies",
      score: 62,
      course: 24
   },
   {
      team: "Dropkick Murphies",
      score: 69,
      course: 26
   },
   {
      team: "Gigantic",
      score: 67,
      course: 26
   },
   {
      team: "Gigantic",
      score: 65,
      course: 17
   },
   {
      team: "Gigantic",
      score: 63,
      course: 24
   }
]

一种方法是使用。在每次迭代中,您可以检查当前分析的对象是否已经存在于累积数组中(即具有相同
团队名称的对象已经存在)。然后,您可以使用此条件将新的整个对象推送到累积数组中,或者只向
数组添加一组新数据:

const轮=[
{团队:“Dropkick Murphies”,得分:75分,路线:17},
{团队:“Dropkick Murphies”,得分:62,路线:24},
{球队:“Dropkick Murphies”,得分:69,球场:26},
{球队:“巨人队”,得分:67,球场:26},
{球队:“巨人队”,得分:65,球场:17},
{球队:“巨人队”,得分:63,球场:24}
];
让res=rounds.reduce((r,{team,score,course})=>
{
让found=r.findIndex(x=>x.team==team);
如果(发现>=0)
r[found].rounds.push({score:score,course:course});
其他的
r、 推送({团队:团队,回合:[{分数:分数,课程:课程}]});
返回r;
}, []);

控制台日志(res)您可以为转换实现一个助手函数

function convertRoundsToLeaderBoard(rounds) {
    var indexes = {};
    var leaderBoard = [];
    for (var round of rounds) {
        if (indexes[round.team] === undefined) {
            indexes[round.team] = leaderBoard.length;
            leaderBoard.push({
                team: round.team,
                rounds: [{score: round.score, course: round.course}]
            });
        } else {
            leaderBoard[indexes[round.team]].rounds.push({score: round.score, course: round.course});
        }
    }
    return leaderBoard;
}
让我们测试一下:

convertRoundsToLeaderBoard(
[
   {
      team: "Dropkick Murphies",
      score: 75,
      course: 17
   },
   {
      team: "Dropkick Murphies",
      score: 62,
      course: 24
   },
   {
      team: "Dropkick Murphies",
      score: 69,
      course: 26
   },
   {
      team: "Gigantic",
      score: 67,
      course: 26
   },
   {
      team: "Gigantic",
      score: 65,
      course: 17
   },
   {
      team: "Gigantic",
      score: 63,
      course: 24
   }
]);

我建议团队使用
地图
输入数据。这样,您就可以使用具有线性时间复杂度的
forEach
循环构建数据:

const rounds=[{团队:“滴滴球墨菲”,得分:75,球场:17},{团队:“滴滴球墨菲”,得分:62,球场:24},{团队:“滴滴球墨菲”,得分:69,球场:26},{团队:“巨人”,得分:67,球场:26},{团队:“巨人”,得分:65,球场:17},{团队:“巨人”,得分:63,球场:24}];
//创建每个团队一个条目的地图
const map=newmap(rounds.map({team})=>[team,[]);
//用他们的分数填充每个团队
rounds.forEach({team,score,course})=>map.get(team.push({score,course}));
//将地图转换为所需的数据结构
const result=Array.from(map,([team,rounds])=>({team,rounds}));

控制台日志(结果)可能不是最优雅的解决方案,但这里有另一个:

var data = {
    rounds: [{
            team: "Dropkick Murphies",
            score: 75,
            course: 17
        },
        ...
    ]
};

var groups = {};
for (var o of data.rounds) {
    if (!groups[o.team])
        groups[o.team] = [];
    groups[o.team].push({
        score: o.score,
        course: o.course
    });
}
var result = [];
for (var g in groups) {
    result.push({
        team: g,
        rounds: groups[g]
    });
}

您可以使用reduce来完成它

在这里,我们使用
团队名称
作为密钥属性,并检查它是否已经在输出对象中,我们推送该特定团队密钥的
分数
课程
轮数属性,如果没有,则创建一个新密钥

const轮=[
{团队:“Dropkick Murphies”,得分:75分,路线:17},
{团队:“Dropkick Murphies”,得分:62,路线:24},
{球队:“Dropkick Murphies”,得分:69,球场:26},
{球队:“巨人队”,得分:67,球场:26},
{球队:“巨人队”,得分:65,球场:17},
{球队:“巨人队”,得分:63,球场:24}
];
让op=rounds.reduce((输出,电流)=>{
if(输出[当前团队]){
输出[current.team].rounds.push({
分数:current.score,
课程:当前成绩
})}否则{
输出[当前团队]={
团队:当前团队,
回合:[{score:current.score,course:current.course}]
}
}
返回输出
},{})

console.log(Object.values(op))
Hey@Luke,强烈建议按照您想要的方式显示尝试的代码。Stackoverflow不是一个请求和接收站点,我们会帮助编写代码。请修改上面的问题,不要太含糊。
var data = {
    rounds: [{
            team: "Dropkick Murphies",
            score: 75,
            course: 17
        },
        ...
    ]
};

var groups = {};
for (var o of data.rounds) {
    if (!groups[o.team])
        groups[o.team] = [];
    groups[o.team].push({
        score: o.score,
        course: o.course
    });
}
var result = [];
for (var g in groups) {
    result.push({
        team: g,
        rounds: groups[g]
    });
}