2016-06-21 65 views
-1

总和多个键取决于总数。

例如: 我有一个json文件的大列表或数据集的对象。总和多个键取决于总数

var obj = [ 
    { 'itemz': 'tomato', 'value': 5 }, 
    { 'itemz': 'potatos', 'value': 3 }, 
    { 'itemz': 'banana', 'value': 7 }, 
    { 'itemz': 'orange', 'value': 6 }, 
    { 'itemz': 'apple', 'value': 4 }, 
    { 'itemz': 'cherries', 'value': 5 }, 
    { 'itemz': 'watermelon', 'value': 9 }, 
    { 'itemz': 'orange', 'value': 8 } 
]; 
var total = prompt("Put the number:"); // i choose 9 

我想获得的所有结果itemz的9和:在我们的例子 结果将是:

项目是:

watermelon //sum=9  
orange, potatos //6+3=9 
apple, tomato //4+5=9 
apple, cherries //4+5=9 
  • itemz属性是唯一的,所以没有重复。
  • 值不是唯一的。
  • 我选择小数来快速计数并获得我的观点。
  • 如果可以使无线电选择搜索一个或两个或三个最大值。
  • 结果必须不重复,即:“potatos,potatos,potatos”。
  • 支持utf-8。
+0

我相信这是一个众所周知的难题,或许有通过这一读:HTTPS://en.wikipedia .ORG /维基/ Subset_sum_problem。有办法使用动态编程来处理整数解决方案,但使用非唯一的值,我只是不确定 –

回答

0

是这样的:

function subsetSum(numbers, target, partial) { 
    var s, n, remaining; 
partial = partial || []; 
s=0; 
for(var j=0;j<partial.length;j++){ 
    s=parseInt(partial[j].value)+ s; 
    } 

    // check if the partial sum is equals to target 

    if (s === target) { 
    console.log("combination is"); 
    var result=""; 
    partial.forEach(function(i){result=result+i.itemz+",";}) 
    console.log(result); 
    } 


    if (s >= target) { 
    return; // if we reach the number why bother to continue 
    } 

    for (var i = 0; i < numbers.length; i++) { 
    n = numbers[i]; 
    remaining = numbers.slice(i + 1); 
    subsetSum(remaining, target, partial.concat([n])); 
    } 
} 
var obj = [ 
    { 'itemz': 'tomato', 'value': 5 }, 
    { 'itemz': 'potatos', 'value': 3 }, 
    { 'itemz': 'banana', 'value': 7 }, 
    { 'itemz': 'orange', 'value': 6 }, 
    { 'itemz': 'apple', 'value': 4 }, 
    { 'itemz': 'cherries', 'value': 5 }, 
    { 'itemz': 'watermelon', 'value': 9 } 
]; 
subsetSum(obj,24); 
+0

**谢谢你们,你做得很好,但我不清楚我的观点。** ** i希望每个结果在新的生产线,即:**

 watermelon orange, potatos apple, tomato apple, cherries 
**不是在新行每个数组,如:**
 watermelon orange potatos apple tomato apple cherries
也值不是1〜9只,为它'大的数字,唯一的例子。 – kingmaster

+0

**谢谢你们你做得很好,但我没有明确我的观点。** **我想每一个结果都换行,即:** >西瓜 >橘子,马铃薯 >苹果,番茄 >苹果,樱桃 **未在新的一行像每一个阵列:** >西瓜 >橙 >马铃薯 >苹果 >番茄 >苹果 >樱桃 也值不为1至只有9个,它只是大数字的例子。 – kingmaster

+0

https://s32.postimg.org/knzkilejp/1ro.png – kingmaster

0

var obj = [{ 
 
    'itemz': 'tomato', 
 
    'value': 5 
 
}, { 
 
    'itemz': 'potatos', 
 
    'value': 3 
 
}, { 
 
    'itemz': 'banana', 
 
    'value': 7 
 
}, { 
 
    'itemz': 'orange', 
 
    'value': 6 
 
}, { 
 
    'itemz': 'apple', 
 
    'value': 4 
 
}, { 
 
    'itemz': 'cherries', 
 
    'value': 5 
 
}, { 
 
    'itemz': 'watermelon', 
 
    'value': 9 
 
}, { 
 
    'itemz': 'orange', 
 
    'value': 8 
 
}]; 
 

 
var res = obj.filter(function(d) { 
 
    if (d.value == 9) { 
 
    return d; 
 
    } 
 
}); 
 

 
for (var i = 0; i < obj.length; i++) { 
 
    for (var j = 0; j < obj.length; j++) { 
 
    if (obj[i].value + obj[j].value == 9) { 
 
     res.push(obj[i]); 
 
     res.push(obj[j]); 
 
    } 
 
    } 
 
} 
 

 
function getUniqueElements(arr) { 
 

 
    var obj = {}; 
 
    var objArray = []; 
 
    for (var i = 0; i < arr.length; i++) { 
 
    obj[arr[i]['value']] = arr[i]; 
 
    } 
 
    for (var prop in obj) { 
 
    objArray.push(obj[prop]); 
 

 
    } 
 
    return objArray; 
 
} 
 
var result = getUniqueElements(res); 
 
document.write('<pre>' + JSON.stringify(result, 0, 4) + '</pre>');

+0

hello @ozil我在http请求中尝试你的漂亮代码并获得这个结果https: //s32.postimg.org/xo9jlzhit/f95.png,对于大列表,此总和= 95的截屏结果不能定义哪些数组总共等于95。所以更好,但导致每一行。以及如何使用外部json将更适合大型列表。 – kingmaster