如何对项目进行分组,使其不超过JavaScript中的总量?

如何对项目进行分组,使其不超过JavaScript中的总量?,javascript,Javascript,我有一个包含n个对象的数组。每个对象都有id、数量、价格和总数等名称。这些都对解决这一问题具有重要意义 如何创建其对象的所有total总和不超过150的新数组 我的阵列: let array = [{id: 1, quantity: 5, price: 10, total: 50}, {id: 2, quantity: 3, price: 100, total: 300}] array1 = [{id: 1, quantity: 5, price: 10, total: 50}, {id: 2

我有一个包含n个对象的数组。每个对象都有id、数量、价格和总数等名称。这些都对解决这一问题具有重要意义

如何创建其对象的所有
total
总和不超过150的新数组

我的阵列:

let array = [{id: 1, quantity: 5, price: 10, total: 50}, {id: 2, quantity: 3, price: 100, total: 300}]
array1 = [{id: 1, quantity: 5, price: 10, total: 50}, {id: 2, quantity: 1, price: 100, total: 100}]
array2 = [{id: 2, quantity: 1, price: 100, total: 100}]
array3 = [{id: 2, quantity: 1, price: 100, total: 100}]
预期结果:

let array = [{id: 1, quantity: 5, price: 10, total: 50}, {id: 2, quantity: 3, price: 100, total: 300}]
array1 = [{id: 1, quantity: 5, price: 10, total: 50}, {id: 2, quantity: 1, price: 100, total: 100}]
array2 = [{id: 2, quantity: 1, price: 100, total: 100}]
array3 = [{id: 2, quantity: 1, price: 100, total: 100}]
条件:

let array = [{id: 1, quantity: 5, price: 10, total: 50}, {id: 2, quantity: 3, price: 100, total: 300}]
array1 = [{id: 1, quantity: 5, price: 10, total: 50}, {id: 2, quantity: 1, price: 100, total: 100}]
array2 = [{id: 2, quantity: 1, price: 100, total: 100}]
array3 = [{id: 2, quantity: 1, price: 100, total: 100}]
  • 如上所述,新阵列中的
    total
    s之和不得超过150
  • total
    的值必须始终是该对象中
    数量
    价格
    的乘积
  • 在满足上述条件之前,对象必须不断将自身划分为数量较小的新对象
  • 数量
    必须是整数
  • 我试过这个。

    const itemsFinals = [];
    const maxTotal = 150;
    let totalGroup = 0;
    for (i = 0; i < itemComprobantes.length; i++) {
        if((itemComprobantes[i].total  + totalGroup) < maxTotal){
            itemsFinals.push(itemComprobantes[i]);
            totalGroup += itemComprobantes[i].total;
        }
    }
    
    const itemsFinals=[];
    常数maxTotal=150;
    设totalGroup=0;
    对于(i=0;i
    让itemComprobantes=[
    {id:1,数量:5,价格:10,总数:50},
    {id:2,数量:1,价格:100,总计:100},
    {id:3,数量:1,价格:100,总计:100},
    {id:4,数量:1,价格:100,总计:30},
    {id:5,数量:1,价格:100,总计:80}
    ]
    const itemsFinals={}
    常数maxTotal=150
    设totalGroup=0
    设群=1
    对于(i=0;imaxTotal){
    组+=1
    totalGroup=0
    }
    if(itemsFinals['group'+group]==未定义){
    itemsFinals['group'+group]=[]
    }
    itemsFinals['group'+group].push(itemComprobantes[i])
    totalGroup+=itemComprobantes[i]。总计
    }
    
    log(itemsFinals)
    这里有一种方法。我知道它很长,但是试试看

    let数组=[{id:1,数量:5,价格:10,总计:50},{id:2,数量:3,价格:100,总计:300},{id:3,数量:5,价格:40,总计:200},{id:4,数量:2,价格:10,总计:20}];
    常数maxTotal=150;
    让新的_数组={};
    设指数=0;
    设最终_总数=0;
    新的数组['array\'+index]=[];
    for(数组的var obj){
    最终总额+=目标总额;
    while(最终总计>最大总计){
    让超过_值=最终_总计-maxTotal;//350-150=200
    让保留数量=parseInt((obj.total-超过值)/obj.price);/(300-200)/100=2
    剩余数量=对象数量-保留数量;
    如果(保留数量!=0){
    retain_obj=Object.assign({},obj);
    保留对象数量=保留对象数量;
    保留对象总计=保留数量*对象价格;
    新的数组[“数组”+索引]。推送(保留对象);
    }
    索引++;
    新的数组['array\'+index]=[];
    new_obj=Object.assign({},obj,{数量:剩余_数量,合计:剩余_数量*obj.price})
    新建数组[“数组”+索引]。推送(新建对象);
    //控制台日志(新的_obj);
    obj=新的_obj;
    最终合计=剩余数量*目标价格;
    新建_数组['array_'+index].pop();//如果要再次重复循环
    }
    新建数组[“数组”+索引].push(obj);//打印新数量和剩余数量
    }
    
    console.log(新的\u数组)
    为什么
    itemComprobantes[0]
    不是
    itemComprobantes[i]
    ?这意味着每个循环都只需获取当前
    循环中数组的第一个元素
    ,也就是这个
    (itemComprobantes[0].total+totalGroup)
    ?这是否回答了您的问题?我们说的总量是每个对象的
    total
    键还是数组中元素的总数?您的
    totalGroup
    不应该只添加
    total
    键,而不是像这样添加整个对象吗
    totalGroup+=itemComprobantes[i]。total
    ?谢谢,但是没有达到预期的结果。您能详细说明您的问题吗?为什么在您的代码段中,
    maxTotal
    150
    ,而您问题中的第一个代码段是总共
    350
    let array=[{id:1,数量:5,价格:10,总计:50},{id:2,数量:3,价格:100,总计:300}]
    每个数组的总和不能超过150,如果超过,则添加到下一个数组中。我想OP希望您在第一个代码段中输入数据,并获得第二个代码段的结果