我有一个数值和一个包含多个键控数值的对象。我需要弄清楚对象中哪些值与加起来的值匹配。
我能想出的唯一解决方案是线性的:
var values={1: 10, 2: 20, 3: 30};
var value=50;
var selected=[];
$.each(values, function(k,v){
if(v==value)
selected.push(k);
$.each(values, function(k2,v2){
if(v+v2==value) {
selected.push(k);
}
});
});
console.log(selected);

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
&#13;
这适用于只有两个匹配值的对象(例如,值为50时)。但如果所有三个匹配(将值设置为60),则不会产生任何结果。
有没有办法解决这个而不使用递归函数调用? 如果是,怎么样?
答案 0 :(得分:2)
您可以生成值数组的所有子集,并根据它们是否匹配来过滤它们。通过这个,您获得了O(n^2)
的每个长度(请注意,这仅适用于少于32个元素的值):
const results = [];
for(let i = 1; i < Math.pow(2, values.length); i++){
const subset = values.filter((_, pos) => (i >> pos) & 1);
if(subset.reduce((a, b) => a + b) === value)
results.push(subset);
}
答案 1 :(得分:2)
首先,获取所有索引子集。然后对它们应用过滤器:此过滤器从索引处的arr中检索值并将其添加。然后,只输出结果。
优点,您可以将此策略用于任何类型的数组:数字,对象或其他任何类型,只需修改reduce函数即可正确检索原始数组中的值。
希望它有所帮助。
<bean id="messageSource"
class="org.springframework.context.support.ResourceBundleMessageSource">
<property name="basename" value="/WEB-INF/classes/resources/xxx_en" />
&#13;