Javascript 基于多个嵌套值对嵌套数组排序的最佳方法

Javascript 基于多个嵌套值对嵌套数组排序的最佳方法,javascript,arrays,Javascript,Arrays,我需要确定[8,10,12]的最经济组合,以等于给定的数字(8到60之间),并将该组合存储在一个变量中供以后使用。数字可以重复(8+8=16、10+10=20等)。给定的数字将始终为偶数。允许组合超过给定数量2(例如给定数量为14,可接受组合为8+8) 我可以计算组合并将它们存储在嵌套数组中。然后,我可以根据其中一个索引对数组进行排序,这将在许多情况下解决问题。我在数组上尝试了一些条件排序,但结果不一致 我的代码 var combo = (num) => { var arr

我需要确定[8,10,12]的最经济组合,以等于给定的数字(8到60之间),并将该组合存储在一个变量中供以后使用。数字可以重复(8+8=16、10+10=20等)。给定的数字将始终为偶数。允许组合超过给定数量2(例如给定数量为14,可接受组合为8+8)

我可以计算组合并将它们存储在嵌套数组中。然后,我可以根据其中一个索引对数组进行排序,这将在许多情况下解决问题。我在数组上尝试了一些条件排序,但结果不一致

我的代码

var combo = (num) => {
        var arr = [];
        let units = [8, 10, 12];
        for (let i = 0; i < units.length; i++) {
            arr.push([units[i],Math.floor(num / units[i]),num%units[i]]);
            } 
            console.log(arr);
    }; 


//combo(24);
//returns
//[[8, 3, 0],[10, 2, 4],[12, 2, 0]]
在这种情况下,第二个数组是期望的结果

//combo(42)
//returns
//[[8, 5, 2],[10, 4, 2],[12, 3, 6]]
在这种情况下,第三个数组是所需的结果,因为用8替换6之后将超过给定的num 2,这是一个可接受的结果

我的目标是首先分离出所需的结果,并将其存储在单独的变量中或数组中的一致位置(通过排序),以供以后使用。我已经发现了1000种不这样做的方法,但是,一种成功的方法让我不知所措。我会把我的javascript经验分为“高初学者”或“低中级”,因为我是在业余时间学习的。我可能是从错误的方向来处理这个问题,所以任何指导都是非常感谢的。希望我对这个问题的描述有意义。
提前感谢。

根据您的评论,最佳解决方案是因子最小,余数为零的解决方案,这很简单

如果找不到这样的解决方案,我认为您需要的是首先按第二个字段降序(最小长度)排序,然后按全长剩余部分的百分比升序排序,以最小化截断。考虑:

var combo = (length) => {
    var optimals    = [];
    var suboptimals = [];

    [8, 10, 12].forEach( (unit) => {
        let lengths = Math.floor(length / unit);
        let remainder = length % unit;
        let fraction  = remainder / unit ;

        if ( remainder == 0 )
            optimals.push( [unit, lengths] );
        else
            suboptimals.push( [unit, lengths, remainder, fraction] );
    } );

    // This only works as long as the original input list is sorted ascending
    // Because then we know the most optimal solution must be the one 
    // with the biggest factor so we can simply return the last solution
    if ( optimals.length > 0 )
        return optimals[ optimals.length - 1 ];

    // Else we sort the suboptimals
    suboptimals.sort( (a, b) => {
        return a[1] < b[1] ? -1 : // First on # of lengths descending
               a[1] > b[1] ?  1 : 
               a[3] > b[3] ? -1 : // Then on fraction ascending
               a[3] < b[3] ?  1 : 
               0;
      });  

    return suboptimals[0];
}; 

console.log( combo(24) );
console.log( combo(28) );
console.log( combo(42) );

根据您的评论,最佳解决方案是因子最小,余数为零的解决方案,这是微不足道的

如果找不到这样的解决方案,我认为您需要的是首先按第二个字段降序(最小长度)排序,然后按全长剩余部分的百分比升序排序,以最小化截断。考虑:

var combo = (length) => {
    var optimals    = [];
    var suboptimals = [];

    [8, 10, 12].forEach( (unit) => {
        let lengths = Math.floor(length / unit);
        let remainder = length % unit;
        let fraction  = remainder / unit ;

        if ( remainder == 0 )
            optimals.push( [unit, lengths] );
        else
            suboptimals.push( [unit, lengths, remainder, fraction] );
    } );

    // This only works as long as the original input list is sorted ascending
    // Because then we know the most optimal solution must be the one 
    // with the biggest factor so we can simply return the last solution
    if ( optimals.length > 0 )
        return optimals[ optimals.length - 1 ];

    // Else we sort the suboptimals
    suboptimals.sort( (a, b) => {
        return a[1] < b[1] ? -1 : // First on # of lengths descending
               a[1] > b[1] ?  1 : 
               a[3] > b[3] ? -1 : // Then on fraction ascending
               a[3] < b[3] ?  1 : 
               0;
      });  

    return suboptimals[0];
}; 

console.log( combo(24) );
console.log( combo(28) );
console.log( combo(42) );

你说的“最经济”是什么意思?“最经济”可能是我用词不当。任何子数组的索引1表示一个数量。在示例“combo(24)”中,8(索引0)*3(索引1)是24,但12*2也等于24。[12,2,0]更经济。谢谢你的提问,我希望这能澄清问题。不,你只是重复了你已经说过的话。恐怕你无法解决这个问题,或者至少我不能,除非你能清楚地说明你所说的经济性是什么意思。是什么让12*2比8*3更经济呢。8、10和12表示木材的长度。Num表示总长度。“最经济”的解决方案是需要最少的长度来实现整个长度。2段12比3段8更经济(与数量相关)。随着num的增加,这种经济变得更加重要,例如:48(num)=6在8时,4在10+1在8时,4在12时-4在12时是最经济的。你说的“最经济”是什么意思?就我而言,“最经济”可能是个糟糕的选择。任何子数组的索引1表示一个数量。在示例“combo(24)”中,8(索引0)*3(索引1)是24,但12*2也等于24。[12,2,0]更经济。谢谢你的提问,我希望这能澄清问题。不,你只是重复了你已经说过的话。恐怕你无法解决这个问题,或者至少我不能,除非你能清楚地说明你所说的经济性是什么意思。是什么让12*2比8*3更经济呢。8、10和12表示木材的长度。Num表示总长度。“最经济”的解决方案是需要最少的长度来实现整个长度。2段12比3段8更经济(与数量相关)。随着num的增加,这种经济变得更加重要,例如:48(num)=6在8时,4在10+1在8时,4在12时,4在12时是最经济的。这太好了!我非常感谢你的帮助和投入。这不仅有助于解决这个问题,我也学到了很多,我真的很感谢你花时间回答我的问题!以后,我会更清楚细节的!再次感谢!太好了,霍莉!我非常感谢你的帮助和投入。这不仅有助于解决这个问题,我也学到了很多,我真的很感谢你花时间回答我的问题!以后,我会更清楚细节的!再次感谢!
> Array [12, 2]
> Array [10, 2, 8, 0.8]
> Array [12, 3, 6, 0.5]