我遇到了一个问题,我要处理一个给定的值并检查这个值是否大于我的值数组,如果是,则使用我的数组组合输出。我已经在这里问了一个类似的问题:Store values in an array after treat the values from another array
重要说明,我想尽可能重复这些子集。我的解决方案仅提供具有不同数字的子集的组合。
例如。
我的数组总是:
const ArrayPrimitive = [100,50,20,10];
例如输入中的给定值:
条目: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);
我希望我能说清楚。
答案 0 :(得分:1)
当你向它提交“270”时,你得到一个数组[100,100,50,20]。
我将把例外和边缘情况留给你设置守卫。但这似乎可以满足你所有直截了当的情况。
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 );