整理javascript对象数组

整理javascript对象数组,javascript,data-manipulation,Javascript,Data Manipulation,我正在处理的特定数据操作的措辞是困难的,所以请原谅这个糟糕的标题——我将用一个好的例子来反驳。我有以下javascript对象数组,其中包含一些运动数据: [ { team: "Knicks", assists: 24 }, { team: "Knicks", assists: 12 }, { team: "Knicks", assists: 17 }, { team: "Knicks", assists: 19 }, { team: "Warri

我正在处理的特定数据操作的措辞是困难的,所以请原谅这个糟糕的标题——我将用一个好的例子来反驳。我有以下javascript对象数组,其中包含一些运动数据:

[
    { team: "Knicks", assists: 24 }, 
    { team: "Knicks", assists: 12 }, 
    { team: "Knicks", assists: 17 }, 
    { team: "Knicks", assists: 19 }, 
    { team: "Warriors", assists: 31 }, 
    { team: "Warriors", assists: 25 }, 
    { team: "Warriors", assists: 20 }, 
    { team: "Spurs", assists: 15 }, 
    { team: "Spurs", assists: 17 }, 
    { team: "Spurs", assists: 32 }, 
    { team: "Spurs", assists: 12 }, 
    { team: "Spurs", assists: 18 }
]
并将其整理,使数据如下所示:

[
    { team: "Knicks", assists: [24, 36, 53, 72] },
    { team: "Warriors", assists: [31, 56, 76] },
    { team: "Spurs", assists: [15, 32, 64, 76, 94] }

]
const teams= [
    { team: "Knicks", assists: 24 }, 
    { team: "Knicks", assists: 12 }, 
    { team: "Knicks", assists: 17 }, 
    { team: "Knicks", assists: 19 }, 
    { team: "Warriors", assists: 31 }, 
    { team: "Warriors", assists: 25 }, 
    { team: "Warriors", assists: 20 }, 
    { team: "Spurs", assists: 15 }, 
    { team: "Spurs", assists: 17 }, 
    { team: "Spurs", assists: 32 }, 
    { team: "Spurs", assists: 12 }, 
    { team: "Spurs", assists: 18 }
]

let teamGroup = {}

teams.forEach(team => {
  teamGroup[team.team] ? // check if that array exists or not in teamgroup object
    teamGroup[team.team].push(team.assists)  // just push
   : (teamGroup[team.team] = [], teamGroup[team.team].push(team.assists)) // create a new array and push
})

console.log(teamGroup);
原始对象数组中的每个唯一团队在新数组中接收自己的对象,辅助值现在是辅助值的累积和。我相当确信,总是以正确的方式对原始对象数组进行排序,这样自上而下的循环将产生正确的累积和

非常感谢您的帮助,谢谢

可以使用reduce方法构建对象,然后使用object.values方法获取对象数组

康斯特数据=[{球队:尼克斯,助攻:24},{球队:尼克斯,助攻:12},{球队:尼克斯,助攻:17},{球队:尼克斯,助攻:19},{球队:勇士,助攻:31},{球队:勇士,助攻:25},{球队:勇士,助攻:20},{球队:马刺,助攻:15},{球队:马刺,助攻:17},{球队:马刺,助攻:32},{球队:马刺,助攻:12},{球队:马刺,助攻:18}] const result=data.reducer,{team,assistences}=>{ 如果!r[team]r[team]={团队,助攻:[助攻]} else r[team].助攻.pushr[team].助攻.slice-1[0]+助攻; 返回r; }, {}
console.logObject.valuesresult您还可以使用arrayforEach方法,如下所示:

[
    { team: "Knicks", assists: [24, 36, 53, 72] },
    { team: "Warriors", assists: [31, 56, 76] },
    { team: "Spurs", assists: [15, 32, 64, 76, 94] }

]
const teams= [
    { team: "Knicks", assists: 24 }, 
    { team: "Knicks", assists: 12 }, 
    { team: "Knicks", assists: 17 }, 
    { team: "Knicks", assists: 19 }, 
    { team: "Warriors", assists: 31 }, 
    { team: "Warriors", assists: 25 }, 
    { team: "Warriors", assists: 20 }, 
    { team: "Spurs", assists: 15 }, 
    { team: "Spurs", assists: 17 }, 
    { team: "Spurs", assists: 32 }, 
    { team: "Spurs", assists: 12 }, 
    { team: "Spurs", assists: 18 }
]

let teamGroup = {}

teams.forEach(team => {
  teamGroup[team.team] ? // check if that array exists or not in teamgroup object
    teamGroup[team.team].push(team.assists)  // just push
   : (teamGroup[team.team] = [], teamGroup[team.team].push(team.assists)) // create a new array and push
})

console.log(teamGroup);

以下是使用临时ES6映射的函数式编程方法:

康斯特队=[{队:尼克斯,助攻:24},{队:尼克斯,助攻:12},{队:尼克斯,助攻:17},{队:尼克斯,助攻:19},{队:勇士,助攻:31},{队:勇士,助攻:25},{队:勇士,助攻:20},{队:马刺,助攻:15},{队:马刺,助攻:17},{队:马刺,助攻:32},{队:马刺,助攻:12},{球队:马刺,助攻:18}]; const result=Array.from teams.reduce acc,{team,assists}=>acc.settam,acc.getteam | |【】。concatassists,新地图, [球队,助攻]=>{球队,助攻} ;
console.logresult;lodash库有一个方便的groupBy,可以为您做大量的工作

如果执行const groups=\ u0.groupBydata,team,您将得到:

{
    "Knicks": [
        { "team": "Knicks", "assists": 24},
        { "team": "Knicks", "assists": 12},
        { "team": "Knicks", "assists": 17},
        { "team": "Knicks", "assists": 19},
    ],
    // ...
}
那么

const result = _.map(groups, (teamData, teamName) => {
    // Convert teamData array into a single record
    const assists = _.map(teamData, "assists"); // e.g. [24, 12, 17, 19]
    return { team: teamName, assists: runningTotal(assists) };
});

// Turns an array like [1,2,3,4] into an array like [1,3,6,10]
function runningTotal(array) {
    let prev = 0;
    return array.map(next => {
        prev = next + prev;
        return prev;
    });
}
这就产生了预期的结果

这种方法并不比使用reduce的解决方案短得多,但我个人认为像groupBy和map这样的高阶操作比reduce更容易推理。当然,这需要lodash或类似的groupBy函数


编辑:我完全忽略了一点,即助攻不仅仅是一系列助攻,而是一个连续的总数。添加了一点来说明这一点。代码比reduce解决方案长得多,但我更清楚。

对此有任何尝试吗?你能分享吗?整理不意味着写我的代码吗?展示你尝试了什么?在is-我认为reduce是正确的方法,并且尝试过使用它,但没有成功。我应该能够在我这一方完成此操作,调整此操作,以返回原始Qchanging中显示的数组中的累积总和。将else案例更改为:r[team]。assists.pushr[team]。assists[r[team]。assists.length-1]+助攻;做这个把戏,尽管有点混乱。我没有注意到,更新了我的答案。这并没有给出正确的结果。它给出了{尼克斯:[{助攻:31},{助攻:25},{助攻:20}},而不是[{球队:尼克斯,助攻:[31,25,20]}。你可以像团队一样推.pushteam.assists。我已经更新了上面的答案。我希望现在它能解决您的问题。