如何实现重量差≤15的两条数据合并存入同一数组的JS功能
实现方案
你只需要修改combine函数的逻辑即可,核心调整点如下:
- 新增待配对列表维护还未凑够2条数据的单元素分组
- 遍历每条数据时优先匹配重量差≤15的待配对分组,匹配成功后用两个重量生成新的分组键
- 最终过滤仅保留已完成配对的分组,和你期望的输出格式完全对齐
修改后的完整代码
const source = [{ entryID: 1, entryName: 'player1', weight: 1900, }, { entryID: 2, entryName: 'player2', weight: 1915, }, { entryID: 3, entryName: 'player3', weight: 1915, }, { entryID: 4, entryName: 'player4', weight: 1920, }, { entryID: 5, entryName: 'player5', weight: 1950, }, { entryID: 6, entryName: 'player6', weight: 1965, }, ] const combine = (source) => { const tempResult = {}; // 存储待配对的单元素分组信息:重量、临时键名 const pendingGroups = []; for (const curr of source) { // 查找第一个重量差不超过15的待配对分组 const matchIndex = pendingGroups.findIndex(item => Math.abs(item.weight - curr.weight) <= 15 ); if (matchIndex !== -1) { // 匹配成功,完成配对 const { weight: prevWeight, key: oldTempKey } = pendingGroups.splice(matchIndex, 1)[0]; // 生成小重量在前、大重量在后的正式键名 const formalKey = `${Math.min(prevWeight, curr.weight)}_${Math.max(prevWeight, curr.weight)}`; // 把两条数据合并为分组存入结果 tempResult[formalKey] = [[tempResult[oldTempKey][0][0], curr]]; // 删除临时键 delete tempResult[oldTempKey]; } else { // 无匹配分组,加入待配对列表 const tempKey = `${curr.weight}`; tempResult[tempKey] = [[curr]]; pendingGroups.push({ weight: curr.weight, key: tempKey }); } } // 过滤仅保留已完成配对的分组,和你期望的输出格式一致 const finalResult = {}; Object.keys(tempResult).forEach(key => { if (key.includes('_')) finalResult[key] = tempResult[key]; }); return finalResult; }; var result = combine(source) var html = "" var keys = Object.keys(result) //if there are more than one keys i.e : 2.. for (var i = 0; i < keys.length; i++) { result[keys[i]].forEach(function(val) { val.forEach(function(value, index) { var entryIDs = index == 0 ? "entryIDM[]" : "entryIDW[]" var handlers = index == 0 ? "handlerM[]" : "handlerW[]" var weights = index == 0 ? "weightM[]" : "weightW[]" html += `<input type="text" name="${entryIDs}" value="${value.entryID}"> <input type="text" name="${handlers}" value="${value.entryName}"> <input type="text" name="${weights}" value="${value.weight}"> ` }) }) } document.getElementById("result").innerHTML = html console.log(result);
对应的HTML部分不需要修改:
<div id="result"> </div>
输出结果
运行后console.log(result)的输出完全符合你的要求:
{ "1900_1915": [ [ { entryID: 1, entryName: "player1", weight: 1900 }, { entryID: 2, entryName: "player2", weight: 1915 } ] ], "1915_1920": [ [ { entryID: 3, entryName: "player3", weight: 1915 }, { entryID: 4, entryName: "player4", weight: 1920 } ] ], "1950_1965": [ [ { entryID: 5, entryName: "player5", weight: 1950 }, { entryID: 6, entryName: "player6", weight: 1965 } ] ] }
如果不需要保留1950_1965这类你示例里没写出的配对组,可以自行调整过滤逻辑即可。
内容的提问来源于stack exchange,提问作者Ulquiorra Schiffer
相关产品推荐
相关产品推荐

