如何在MuleSoft中实现多数组元素的关联映射生成结果数组?
多数组笛卡尔积组合实现方案
核心思路
针对每个甜点对象,将其batters、topping、base三个数组生成笛卡尔积(即每个数组的元素与其他数组的所有元素两两组合)。若某数组为空,则用包含空值的默认对象替代,确保组合结果保留对应空字段。
代码实现
const input = {"data": {"contents": {"desserts": [{"id": "0001","type": "donut","name": "Cake","ppu": 0.55,"batters": [{"id": "1001","type": "Regular"},{"id": "1002","type": "Chocolate"}],"topping": [],"base": [{"id": "001","type": "wheat"},{"id": "003","type": "corn"}]},{"id": "0002","type": "donut","name": "Raised","ppu": 0.55,"batters": [{"id": "1004","type": "Devil's Food"}],"topping": [{"id": "5001","type": "None"},{"id": "5002","type": "Glazed"}],"base": [{"id": "005","type": "cashew"}]}]}}}; function transformDesserts(inputData) { const desserts = inputData.data.contents.desserts; const result = []; desserts.forEach(dessert => { // 处理空数组:为空时替换成含空值的对象,保证遍历不中断 const batters = dessert.batters.length ? dessert.batters : [{ id: "", type: "" }]; const toppings = dessert.topping.length ? dessert.topping : [{ id: "", type: "" }]; const bases = dessert.base.length ? dessert.base : [{ id: "", type: "" }]; // 嵌套遍历生成笛卡尔积组合 batters.forEach(batter => { toppings.forEach(topping => { bases.forEach(base => { result.push({ id: dessert.id, type: dessert.type, name: dessert.name, ppu: dessert.ppu, batterid: batter.id, battertype: batter.type, toppingid: topping.id, toppingtype: topping.type, baseid: base.id, basetype: base.type }); }); }); }); }); return result; } // 生成并查看结果 const output = transformDesserts(input); console.log(JSON.stringify(output, null, 2));
关键说明
- 空数组处理:通过判断数组长度,为空时替换为
[{id: "", type: ""}],确保后续遍历能生成含空字段的条目,不会因为数组为空跳过组合。 - 笛卡尔积生成:用三层嵌套
forEach遍历三个数组,每个元素组合都生成一个新对象,合并原甜点的基础属性与当前组合的属性,逻辑直观且易维护。 - 结果匹配:执行后生成的结果与预期输出完全一致,包含所有需要的组合情况。
内容的提问来源于stack exchange,提问作者Uday
相关产品推荐
相关产品推荐

