以下是一种可能的解决方案:

function selectByWeight(arr, sendNum) {
  // 按照weight字段排序
  arr.sort((a, b) => a.weight - b.weight);
  // 初始化选中件数和已选数组
  let selectedNum = 0;
  let selectedArr = [];
  // 逐一勾选直至选满总赠送件
  for (let i = 0; i < arr.length; i++) {
    if (selectedNum >= sendNum) {
      break;
    }
    arr[i].selected = true;
    selectedNum++;
    selectedArr.push(arr[i]);
  }
  // 如果还没选满总赠送件,继续按照weight字段从小到大勾选
  if (selectedNum < sendNum) {
    for (let i = 0; i < arr.length; i++) {
      if (selectedNum >= sendNum) {
        break;
      }
      if (!arr[i].selected) {
        arr[i].selected = true;
        selectedNum++;
        selectedArr.push(arr[i]);
      }
    }
  }
  return selectedArr;
}

使用示例:

const arr = [
  { name: 'a', weight: 2 },
  { name: 'b', weight: 1 },
  { name: 'c', weight: 3 },
  { name: 'd', weight: 4 },
  { name: 'e', weight: 2 }
];

const selectedArr = selectByWeight(arr, 3);
console.log(selectedArr);
// 输出:
// [
//   { name: 'b', weight: 1, selected: true },
//   { name: 'a', weight: 2, selected: true },
//   { name: 'e', weight: 2, selected: true }
// ]

在上面的示例中,数组arr中有5个元素,按照weight字段排序后的顺序为[{ name: 'b', weight: 1 }, { name: 'a', weight: 2 }, { name: 'e', weight: 2 }, { name: 'c', weight: 3 }, { name: 'd', weight: 4 }]。我们需要选出3个元素作为赠品,因此调用selectByWeight(arr, 3)函数,返回的结果是一个数组,包含3个元素,它们是按照weight字段从小到大顺序勾选的。在返回的结果中,每个元素都多了一个selected字段,表示它是否被选中

js中数组对象按照weight顺序逐一勾选selectedsendNum为数量勾选至选满总赠送件

原文地址: http://www.cveoy.top/t/topic/eB5q 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录