繁体   English   中英

从对象数组 Javascript 创建嵌套的对象数组

[英]Create nested array of objects from array of objects Javascript

我有以下对象数组。 如何重塑数据以获得预期的 Output?

let performanceReview = [ 
{ "name": "Sean", "Manager": "Joe", "Performance": 5}, 
{ "name": "John", "Manager": "Joe", "Performance": 9}, 
{ "name": "Paul", "Manager": "Joe", "Performance": 0}, 
{ "name": "Derek", "Manager": "Greg", "Performance": 10}, 
{ "name": "Lisa", "Manager": "Greg", "Performance": 10}, 
{ "name": "Julia", "Manager": "Donna", "Performance": 7}];

预计 Output

var Series = [ 
{Manager: "Joe", data: [["Sean", 5], ["John", 9], ["Paul", 0]]}, 
{Manager: "Greg", data: [["Derek", 10],["Lisa", 10]]}, 
{Manager: "Donna", data: [["Julia", 7]]}];

有人也可以帮助我了解他们解决问题的方法。

此解决方案将任务分为两个步骤 (代码可能更短,但这可能比试图将所有逻辑压缩到一个单行中更容易理解。)

  1. 使用Array.prototype.reduce ,我们可以创建一个 object ,其中每个属性都有:
  • 经理的姓名作为键和
  • minions-with-ratings 的二维数组作为值
  1. 然后,使用for...in语法,我们可以将每个属性转换为独立的 object 并将其推送到 output 数组中。

有关说明,请参阅代码内注释。

 // Main const originalArray = getOriginalArray(), obj = groupByManager(originalArray), output = formatFinalArray(obj); console.log(output); // We make an object because, unlike Arrays, they use named properties function groupByManager(input){ const obj = input.reduce( // 1st argument to `reduce` is a 'reducer' function (taking two args) // that will be applied to each item of the array (grouped, item) => { // 1st arg to reducer func is the accumulated value, returned after each loop // 2nd arg to reducer func is the item of the array for the current loop // If there's no prop named for this manager, makes one w/ empty array as value grouped[item.Manager] = grouped[item.Manager] || []; // Makes a two-item array of name and performance and pushes it to prop array grouped[item.Manager].push([item.name, item.Performance]); // The accumulated object has been updated, is ready to be used in next loop return grouped; }, // 2nd arg to `reduce` (an empty obj) to be used as `grouped` during first loop {} ); return obj; } // We'll pass the object into this function to get our desired format function formatFinalArray(obj){ const output = []; for(let key in obj){ output.push({ Manager: key, data: obj[key] }); } return output; } // Just provides our original array function getOriginalArray(){ return [ { "name": "Sean", "Manager": "Joe", "Performance": 5 }, { "name": "John", "Manager": "Joe", "Performance": 9 }, { "name": "Paul", "Manager": "Joe", "Performance": 0 }, { "name": "Derek", "Manager": "Greg", "Performance": 10 }, { "name": "Lisa", "Manager": "Greg", "Performance": 10 }, { "name": "Julia", "Manager": "Donna", "Performance": 7 } ]; }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM