2016-06-21 5 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 Свойства уникальны, поэтому дубликатов нет.
  • значения не уникальны.
  • Я выбираю маленькие цифры, чтобы быстро пересчитывать и получать свою оценку.
  • если вы можете сделать радио, чтобы выбрать для поиска по одному пункту или два, или три максим.
  • результат не должен повторяться i.e: "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 только, 's только пример для больших чисел. – 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

привет @ozil я пробую ваш хороший код в http-запросе и получаю этот результат https: //s32.postimg.org/xo9jlzhit/f95.png, этот результат скриншота sum = 95, для большого списка не может определить, какие массивы равны 95. так лучше, но результат каждой линии. и как использовать внешний json будет лучше для больших списков. – kingmaster

Смежные вопросы