javascript - 尽可能使用重复值存储数组的子集

标签 javascript arrays ecmascript-6

我遇到了一个问题,我必须处理给定值并检查该值是否大于我的值数组,如果是,则使用我的数组合并输出。我已经在这里问过类似的问题:Store values in an array after treat the values from another array

重要注意事项,我想尽可能重复这些子集。我的解决方案仅提供不同数量的子集的组合。

例如。

我的数组永远是:

const ArrayPrimitive = [100,50,20,10];

例如输入中的给定值:

  • 输入:30.00 结果:[20.00, 10.00]
  • 输入:80.00 结果:[50.00, 20.00, 10.00]
  • 条目:125.00 结果:抛出 NoteUnavailableException
  • 条目:-130.00 结果:抛出 InvalidArgumentException
  • 条目:NULL 结果:[空集]
  • 条目:200 预期结果:[100.00, 100.00]* 这是我陷入困境的地方,我想组合子集的相同值(我的数组
    在使用较小的数字之前尽可能多地使用原始值。

    在这种情况下,我的子集中需要 2 个 100 的值,当我测试这个时,它们的函数会抛出一个错误。

       const ArrayPrimitive = [100, 50, 20, 10]; // Assuming presorted     array(descending)
    
    function findChange(m) {
      return ArrayPrimitive.reduce((mm, c) => {
        if (mm.rest >= c) {
          mm.change.push(c);
          mm.rest -= c
        }
        return mm
      }, {
        change: [],
        rest: m
      });
    }
    
    function findChangeOld(m) {
      var retval = {
          change: [],
          rest: m
        },
        i = ArrayPrimitive.length;
    
      for (var x = 0; x < i; x++) {
        if (retval.rest >= ArrayPrimitive[x]) {
          retval.change.push(ArrayPrimitive[x])
          retval.rest -= ArrayPrimitive[x];
        }
      }
      return retval;
    }
    
    function calcChange(v) {
      var c = findChangeOld(v);
    
      if (v < 0 || isNaN(v)) {
        console.log('${v}: throw InvalidArgumentException');
        return;
      }
    
      if (c.rest > 0)
        console.log('${v}: throw NoteUnavailableException');
      else
        console.log('${v}: ${c.change}');
    }
    
    calcChange(30);
    calcChange(80);
    calcChange(105);
    calcChange(125);
    calcChange(-130);
    calcChange(null);
    

我希望我已经说清楚了。

最佳答案

当您向此提交“270”时,您会得到一个数组 [ 100, 100, 50, 20 ]。

我会将异常(exception)和边缘情况留给您来设置防护。但这似乎满足您所有简单的情况。

        let arr = [100,50,20,10];

        let factors = [];
        let total = 270;

        arr.forEach ( d => {
            while ( total >= d ) {
                factors.push ( d );
                total -= d;
            }
        } );

        // [100, 100, 50, 20]
        console.log ( factors );

关于javascript - 尽可能使用重复值存储数组的子集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41743831/

相关文章:

javascript - 在下拉单击时更改 iFrame

C++ 到 MIPS 汇编

javascript - 为什么全局数组声明会使测试失败?

javascript - 如何将 $q 提供程序插入到未包装到 Angular 模块中的类中?

javascript - 如何从 react native 中的 json 数据中删除 html 标签?

javascript - D3 js - onClick of circle 我想在那个背景中添加区域

javascript - 指令根模板元素中的属性

c - 将变量分配给结构体数组的成员时出现预期标识符或 '(' 错误

javascript - 分割空格并搜索用户输入

javascript - CJS 和 ES6 模块之间的语法差异