[英]Create chunks of big array based on element properties
我有一个问题,解决它的方法是根据它们的属性(ID)对我的数组中的元素进行分组。 让我解释:
这是给定的数组:
[ { project_id: 'project:710f57c6bb18753dfeaad60b7a7437df',
end_date: '2017-05-18',
invoice_method: 'FixedFee',
amount: '1.000000',
price: '134.000000' },
{ project_id: 'project:710f57c6bb18753dfeaad60b7a7437df',
start_date: '2017-06-01',
subscription_cycle: 'Month',
invoice_method: 'Subscription',
amount: '1.000000',
price: '49.000000' },
{ project_id: 'project:abcdefghijklmnop',
start_date: '2017-06-01',
subscription_cycle: 'Month',
invoice_method: 'Subscription',
amount: '1.000000',
price: '49.000000'},
{ project_id: 'project:abcdefghijklmnop',
start_date: '2017-06-01',
subscription_cycle: 'Month',
invoice_method: 'Subscription',
amount: '1.000000',
price: '49.000000'},
]
这个大数组中的前 2 个元素具有相同的 ID,后 2 个元素具有相同的 ID,所以我想要的 output 是这样的:
//MAIN ARRAY
[
//ONE CHUNK
[
{ project_id: 'project:710f57c6bb18753dfeaad60b7a7437df',
end_date: '2017-05-18',
invoice_method: 'FixedFee',
amount: '1.000000',
price: '134.000000' },
{ project_id: 'project:710f57c6bb18753dfeaad60b7a7437df',
start_date: '2017-06-01',
subscription_cycle: 'Month',
invoice_method: 'Subscription',
amount: '1.000000',
price: '49.000000' }
]
//ONE CHUNK
[
{ project_id: 'project:abcdefghijklmnop',
start_date: '2017-06-01',
subscription_cycle: 'Month',
invoice_method: 'Subscription',
amount: '1.000000',
price: '49.000000'},
{ project_id: 'project:abcdefghijklmnop',
start_date: '2017-06-01',
subscription_cycle: 'Month',
invoice_method: 'Subscription',
amount: '1.000000',
price: '49.000000'}
]
]
有些人喜欢这样根据键名进行分组。
不准确,但你可以这样做。 .reduce()
将起作用。
这里 keyName project_id
用于对对象数组进行分组。
const data = [ { project_id: 'project:710f57c6bb18753dfeaad60b7a7437df',
end_date: '2017-05-18',
invoice_method: 'FixedFee',
amount: '1.000000',
price: '134.000000' },
{ project_id: 'project:710f57c6bb18753dfeaad60b7a7437df',
start_date: '2017-06-01',
subscription_cycle: 'Month',
invoice_method: 'Subscription',
amount: '1.000000',
price: '49.000000' },
{ project_id: 'project:abcdefghijklmnop',
start_date: '2017-06-01',
subscription_cycle: 'Month',
invoice_method: 'Subscription',
amount: '1.000000',
price: '49.000000'},
{ project_id: 'project:abcdefghijklmnop',
start_date: '2017-06-01',
subscription_cycle: 'Month',
invoice_method: 'Subscription',
amount: '1.000000',
price: '49.000000'
}]
let result = data.reduce(function (r, a) {
r[a.project_id] = r[a.project_id] || [];
r[a.project_id].push(a);
return r;
}, []);
console.log(result);
由于您不要求提供代码,因此这里有一个大纲:
创建一个Map或 object 以便您可以快速找到一个 id(作为键)和关联的子数组(作为值)。
迭代您的数据,并为每个 object 在您的地图/对象中查找子数组。 如果该 id 还没有条目,则为该 id 创建一个空子数组。 在任何一种情况下,将当前 object 推送到该子阵列
最后从您的地图/对象中获取所有这些子数组并将它们连接到一个最终数组。
隐藏代码,以防您无法使其工作:
const data = [ { project_id:'project:710f57c6bb18753dfeaad60b7a7437df', end_date: '2017-05-18',invoice_method: 'FixedFee',amount: '1.000000',price: '134.000000' },{ project_id: 'project:710f57c6bb18753dfeaad60b7a7437df',start_date: '2017-06-01',subscription_cycle: 'Month',invoice_method: 'Subscription',amount: '1.000000',price: '49.000000' },{ project_id: 'project:abcdefghijklmnop',start_date: '2017-06-01',subscription_cycle: 'Month',invoice_method: 'Subscription',amount: '1.000000',price: '49.000000'},{ project_id: 'project:abcdefghijklmnop',start_date: '2017-06-01',subscription_cycle: 'Month',invoice_method: 'Subscription',amount: '1.000000',price: '49.000000'}]; let map = new Map(data.map(o => [o.project_id, []])); data.forEach(o => map.get(o.project_id).push(o)); let result = Array.from(map.values()); console.log(result);
检查此解决方案,希望对您有所帮助。
var initailArray = [ { project_id: 'project:710f57c6bb18753dfeaad60b7a7437df',
end_date: '2017-05-18',
invoice_method: 'FixedFee',
amount: '1.000000',
price: '134.000000' },
{ project_id: 'project:710f57c6bb18753dfeaad60b7a7437df',
start_date: '2017-06-01',
subscription_cycle: 'Month',
invoice_method: 'Subscription',
amount: '1.000000',
price: '49.000000' },
{ project_id: 'project:abcdefghijklmnop',
start_date: '2017-06-01',
subscription_cycle: 'Month',
invoice_method: 'Subscription',
amount: '1.000000',
price: '49.000000'},
{ project_id: 'project:abcdefghijklmnop',
start_date: '2017-06-01',
subscription_cycle: 'Month',
invoice_method: 'Subscription',
amount: '1.000000',
price: '49.000000'},
];
let dummyObj = {};
initailArray.forEach((data)=>{
if(!dummyObj[data.project_id]){
dummyObj[data.project_id] = [data];
}else{
dummyObj[data.project_id].push(data);
}
});
let finalResult = [Object.values(dummyObj)];
console.log("finalResult", finalResult);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.