获取所有可能的对象组合,其中值的总和与数字匹配

时间:2016-04-26 18:35:09

标签: javascript arrays typescript

希望在打字稿中这样做。

我有一个对象数组,其中每个对象都有一个名为rating的属性。数组看起来像这样:

var objects = [{"name":"foo","rating":4}, {"name":"bar","rating":5}, {"name":"foobar","rating":2}]

现在我有一个目标评分destinationRating,例如:var destinationRating=11。从这些对象中,我需要得到一个数组,比如20 key1;key2;key3个形状的字符串,其中key1等等是来自对象数组的键,其中所选对象的总和是至少destinationRating。 3个选定的对象最小。我不知道如何应用这种算法的创建。

如果[0:"0;1;2"]数组的前3个对象符合条件,则最终结果应如下objects

1 个答案:

答案 0 :(得分:1)

这是一个生成索引的所有组合的提议(只要它们是必要的,参见输出)并检查给定的条件并返回想要的结果。

结果集包含具有给定数组的索引的字符串,该索引匹配命名属性的所需总和。

function combination(array, property, sum) {
    function c(part, i) {
        var result = [], p, s;
        while (i < n) {
            p = part.slice(0);
            p.push(i++);
            document.write(p + '<br>');
            s = p.reduce(function (r, a) { return r + array[a][property]; }, 0);
            if (s < sum) {
                result = result.concat(c(p, i));
            }
            if (p.length >= 3 && s === sum) {
                result.push(p.join(';'));
                break;
            }
        }
        return result;
    }

    var n = array.length;
    return c([], 0);
}

var objects = [{ "name": "id0", "rating": 4 }, { "name": "id1", "rating": 5 }, { "name": "id2", "rating": 2 }, { "name": "id3", "rating": 6 }, { "name": "id4", "rating": 8 }, { "name": "id5", "rating": 3 }, { "name": "id6", "rating": 1 }];

document.write('<pre>' + JSON.stringify(combination(objects, 'rating', 11), 0, 4) + '</pre>');