如何使用节点typescript按键分组对象数组?



const cars = [{"做":"奥迪","模型":"r8","年":"2012"}, {"做":"克钦独立军","模型":"最佳状态","年":"2013"},

);const details = [{"做":"奥迪","老板":"user1","功能":"abc"}, {"做":"奥迪","老板":"user2","功能":"xyz"},{"做":"克钦独立军","老板":"user3","功能":"xyz"},{"做":"克钦独立军","老板":"user4","功能":"xyz"},

);const result = [{"做":"奥迪","模型":"r8","年":"2012","Details"({"做":"奥迪","老板":"user1","功能":"abc"}, {"做":"奥迪","老板":"user2","功能":"xyz"}]},{"做":"克钦独立军","模型":"最佳状态","年":"2013","Details"({"做":"克钦独立军","老板":"user3","功能":"xyz"},{"做":"克钦独立军","老板":"user4","功能":"xyz"},]},

);

这个想法是首先将details数组分组到make -> [detail]的集合中。时间复杂度是O(n),空间复杂度也是O(n),因为我们创建了一个新的集合。

之后,我们可以在假设每个make只在cars数组中出现一次的情况下,将新的集合合并到cars数组中(如果不是,我们将需要一个中间件步骤)。这里的时间复杂度也是O(n)

// group details collection
const groupDetails = details.reduce((m, detail) => {
const items = m.get(detail.make) || [];
m.set(detail.make, [ ...items, ...[detail] ]);
return m;
}, new Map<string, unknown[]>());
// merge new collection into cars array
const carsDetails = cars.map(car => {
const details = groupDetails.get(car.make) || [];
return { ...car, ...{ Details: details }};
});

参见Typescript playground

中的运行代码示例

最新更新