【问题标题】:Get All possible combinations of objects, where sum of values matches number获取所有可能的对象组合,其中值的总和与数字匹配
【发布时间】:2016-04-26 18:35:09
【问题描述】:

希望在打字稿中做到这一点。

我有一个对象数组,其中每个对象都有一个名为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 个选定对象。我不知道应该如何创建这样的算法。

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

【问题讨论】:

  • 请添加更多数据和一些示例,说明源的样子和想要的结果应该是什么样的。
  • 你真正追求的是什么?您可能需要重新评估您的实际目标并采取不同的方法。如上所述的问题,一旦你得到至少一个符合要求的对象组合,组合的数量将随着数组的长度呈指数增长。
  • 稍微更新了 OP。甚至可能不必是 20 种组合。
  • 因此,不是查找所有可能的组合,而是给您一组组合,您必须确定其中哪一组符合评分标准?
  • 听起来你可以通过迭代键字符串数组来完成它,将每个键字符串拆分为包含索引('键')的数组,然后使用索引对评分求和(通过循环迭代或使用reduce函数)。由于您正在学习,因此我有意为您指出正确的方向,而不是给您答案。对我列出的概念进行一些研究,尝试解决方案,然后如果您遇到问题,请发布您尝试的解决方案以及它与预期结果的不同之处。祝你好运!

标签: javascript arrays typescript


【解决方案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>');

【讨论】:

  • 奇怪的是,对于一个大到可以组合的数据集,总和 6 及以下的组合变成空......你是否准确地限制了总和?也可以过一遍,最多只有 3 个元素...
  • 您只需要 3 个元素?将 if (p.length &gt;= 3 &amp;&amp; s === sum) 更改为 if (p.length === 3 &amp;&amp; s === sum) 或跳过长度检查。
  • 我现在正在实现它以供最终使用,并且我看到了一些我可以使用一些建议的东西。当sum 太小而不能由 3 个元素组成时,它最终不会给我任何组合。在这种情况下,我希望它至少提供一些超出sum 的组合。如何编辑它以实现这一目标?限制仍然是 3 个元素。如果这不能完成,那么我可以解决。
  • 我不能给你一些建议,因为这取决于特殊的实现。但如果您有更具体的问题,请不要犹豫。
猜你喜欢
  • 1970-01-01
  • 2017-08-20
  • 2020-02-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多