如何按fromCurrencyId、toCurrencyId多字段拆分对象数组?
按双字段分组数组对象
问题场景
我有一个包含大量对象的数组,结构如下:
[ { startAt: "2016-01-01 11:35:00", fromCurrencyId: "a49cd579-18ea-44cb-8117-86428b64a27a", toCurrencyId: "c5a0c46c-c5b5-49a5-9a16-4a829269583e" }, { startAt: "2016-01-01 11:40:00", fromCurrencyId: "a49cd579-18ea-44cb-8117-86428b64a27a", toCurrencyId: "c5a0c46c-c5b5-49a5-9a16-4a829269583e" }, { startAt: "2016-01-01 12:00:00", fromCurrencyId: "c5a0c46c-c5b5-49a5-9a16-4a829269583e", toCurrencyId: "5491dfe0-7d61-407d-b642-7fd3ec905302" }, { startAt: "2016-01-01 12:40:00", fromCurrencyId: "c5a0c46c-c5b5-49a5-9a16-4a829269583e", toCurrencyId: "5491dfe0-7d61-407d-b642-7fd3ec905302" }, { startAt: "2016-01-01 11:40:00", fromCurrencyId: "a49cd579-18ea-44cb-8117-86428b64a27a", toCurrencyId: "5491dfe0-7d61-407d-b642-7fd3ec905302" }, ... ]
预期效果
需要按照fromCurrencyId和toCurrencyId两个字段将数组拆分为子数组,最终结果如下:
[ [ { startAt: "2016-01-01 11:35:00", fromCurrencyId: "a49cd579-18ea-44cb-8117-86428b64a27a", toCurrencyId: "c5a0c46c-c5b5-49a5-9a16-4a829269583e" }, { startAt: "2016-01-01 11:40:00", fromCurrencyId: "a49cd579-18ea-44cb-8117-86428b64a27a", toCurrencyId: "c5a0c46c-c5b5-49a5-9a16-4a829269583e" } ], [ { startAt: "2016-01-01 12:00:00", fromCurrencyId: "c5a0c46c-c5b5-49a5-9a16-4a829269583e", toCurrencyId: "5491dfe0-7d61-407d-b642-7fd3ec905302" }, { startAt: "2016-01-01 12:40:00", fromCurrencyId: "c5a0c46c-c5b5-49a5-9a16-4a829269583e", toCurrencyId: "5491dfe0-7d61-407d-b642-7fd3ec905302" } ], [ { startAt: "2016-01-01 11:40:00", fromCurrencyId: "a49cd579-18ea-44cb-8117-86428b64a27a", toCurrencyId: "5491dfe0-7d61-407d-b642-7fd3ec905302" } ] ]
我的尝试
我尝试用lodash的groupBy方法实现,但没得到预期结果,代码如下:
const props = ['fromCurrencyId', 'toCurrencyId'] const a = _.groupBy(data, function(note){ return _.find(_.pick(note, props)); });
解决方案
方法一:使用Lodash实现
之前的问题在于_.find(_.pick(note, props))只返回了第一个属性的值,无法区分两个字段的组合。正确的做法是将两个字段的值拼接成唯一的分组键:
const props = ['fromCurrencyId', 'toCurrencyId']; // 按双字段组合分组 const groupedObj = _.groupBy(data, item => `${item[props[0]]}-${item[props[1]]}`); // 将分组对象转换为二维数组,匹配预期结果 const result = Object.values(groupedObj);
方法二:原生JavaScript实现
不用Lodash的话,可以用Array.reduce手动完成分组:
const props = ['fromCurrencyId', 'toCurrencyId']; // 分组为对象结构 const groupedObj = data.reduce((acc, item) => { const key = `${item[props[0]]}-${item[props[1]]}`; if (!acc[key]) { acc[key] = []; } acc[key].push(item); return acc; }, {}); // 转换为二维数组 const result = Object.values(groupedObj);
内容的提问来源于stack exchange,提问作者andrejuly
相关产品推荐
相关产品推荐

