简体   繁体   English

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

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

I have the following array of objects.我有以下对象数组。 How can I reshape the data to get the Expected Output?如何重塑数据以获得预期的 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}];

Expected Output预计 Output

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

Could someone also please help walk me through their problem solving approach.有人也可以帮助我了解他们解决问题的方法。

This solution breaks the task into two steps .此解决方案将任务分为两个步骤 (The code could be shorter, but this may be a bit easier to understand than trying to squeeze all the logic into a one-liner.) (代码可能更短,但这可能比试图将所有逻辑压缩到一个单行中更容易理解。)

  1. Using Array.prototype.reduce , we can make an object where each property has:使用Array.prototype.reduce ,我们可以创建一个 object ,其中每个属性都有:
  • a manager's name as a key and经理的姓名作为键和
  • the two-dimensional array of minions-with-ratings as the value minions-with-ratings 的二维数组作为值
  1. Then, using the for...in syntax, we can convert each property to an independent object and push it to the output array.然后,使用for...in语法,我们可以将每个属性转换为独立的 object 并将其推送到 output 数组中。

See the in-code comments for clarifications.有关说明,请参阅代码内注释。

 // 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