寻求JavaScript算法:将Products模式数据转换为Reward模式
JavaScript 数据转换:Products 转 Reward 格式
转换逻辑
核心是生成基于产品details列表的笛卡尔组合:
- 先确定需要生成的分组数:等于所有产品中
details数组的最大长度 - 对每个分组索引,为每个产品匹配对应索引的
details项;若产品的details长度不足该索引,则复用其最后一项的属性值 - 合并产品基础信息(
id、name_fa)与details的属性,并将数值类型转为字符串格式
代码实现
const products = [ { id: "65864", name_fa:"پک دفتر 40 برگ وزيري شوميز کلاسيک 40 ", details:[{master: 5,slave: 0,slave2: 0},{master: 11,slave: 0,slave2: 0}] }, { id: 67532, name_fa: "100-بازی لونا", details:[{master: 0,slave: 5,slave2: 0}] } ]; // 计算需要生成的分组数:取所有产品details数组的最大长度 const maxGroupCount = Math.max(...products.map(p => p.details.length)); // 生成目标reward数组 const reward = Array.from({ length: maxGroupCount }, (_, groupIndex) => { const productGroup = products.map(product => { // 获取当前分组对应的details项,超出长度则复用最后一项 const targetDetail = product.details[groupIndex] || product.details.at(-1); return { id: String(product.id), name_fa: product.name_fa.trim(), master: String(targetDetail.master), slave: String(targetDetail.slave), slave2: String(targetDetail.slave2) }; }); return { products: productGroup }; }); // 输出结果 console.log(JSON.stringify(reward, null, 2));
代码说明
- 分组数计算:通过
Math.max(...products.map(p => p.details.length))获取所有产品中details的最长长度,确定最终要生成多少组产品列表 - 细节项匹配:使用
product.details[groupIndex] || product.details.at(-1)处理长度不足的情况,确保每个分组中所有产品都有对应的细节数据 - 格式统一:将
id、master、slave、slave2转为字符串类型,同时去除name_fa的首尾空格,完全匹配目标格式
输出结果
运行代码后,输出的reward结构与目标格式完全一致:
[ { "products": [ { "id": "65864", "name_fa": "پک دفتر 40 برگ وزيري شوميز کلاسيک 40", "master": "5", "slave": "0", "slave2": "0" }, { "id": "67532", "name_fa": "100-بازی لونا", "master": "0", "slave": "5", "slave2": "0" } ] }, { "products": [ { "id": "65864", "name_fa": "پک دفتر 40 برگ وزيري شوميز کلاسيک 40", "master": "11", "slave": "0", "slave2": "0" }, { "id": "67532", "name_fa": "100-بازی لونا", "master": "0", "slave": "5", "slave2": "0" } ] } ]
内容的提问来源于stack exchange,提问作者shahram rezvani
相关产品推荐
相关产品推荐

