You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现重量差≤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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 05:24:03