2016-06-21 61 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