I have an array of objects, e.g.
var arr = [
{"a": "x"},
{"b": "0"},
{"c": "k"},
{"a": "nm"},
{"b": "765"},
{"ab": "i"},
{"bc": "x"},
{"ab": "4"},
{"abc": "L"}
];
假设我只对键与 var input = ["ab", "bc"]
相对应的对象感兴趣。这意味着我想以以下方式提取所有可能的子数组,使得 result[i].length == 2
:
var result = [
[{"ab": "i"}, {"bc": "x"}],
[{"ab": "4"}, {"bc": "x"}] // or [{"bc": "x"}, {"ab": "4"}]
];
也就是说,子数组中对象的顺序绝对不重要:我只关心每个子数组包含两个对象,分别为{"ab": ...}
和 {"bc": ...}
。
如果我对var input = ["a","a","ab"]
感兴趣,结果应该像这样:
var result = [
[{"a": "x"}, {"a": "nm"}, {"ab": "i"}],
[{"a": "x"}, {"a": "nm"}, {"ab": "4"}]
];
我无法找到实现所需结果的方法(假设可能远大于2或3,甚至15-20也不够),而且需要阶乘级别的计算量,这在物理上是不可能的。有没有一种方法可以在解决此类问题时获得合理的性能?
重要提示:是的,显然,对于相对较大的
input.length
值,理论上可能存在非常多的可能组合,但在实践中,result.length
始终会相当小(可能为100-200,我甚至怀疑它是否能达到1000...)。但出于安全考虑,我希望设置一些限制(比如1000),以便只要result.length
达到此限制,函数就会返回当前的result
并停止。
arr
是否包含{"ab":value}
。如果是,则获取下一个{"bc":value}
并将它们都放入result
中。步骤2。检查arr
是否包含{"bc":value}
。如果是,则获取下一个{"ab":value}
并将它们都放入result
中。以此类推,这需要一种阶乘级别的可能情况。 - lyrically wicked["a", "a", "ab"]
这个输出示例吗?"算法"应该如何决定一个值是属于第一个"a"还是后面的那个呢?首先扫描输入,然后决定是否有多个"a",后面的那个应该接收剩余的部分吗?或者你实际上是在寻找每个键的找到对象的乘积? - Ilja Everilä[{"a": "x"}, {"a": "nm"}, {"ab": "i"}]
和[{"a": "x"}, {"a": "nm"}, {"ab": "4"}]
进行比较时,[{"a": "nm"}, {"a": "x"}, {"ab": "4"}]
是否不是“唯一”的?或者你对顺序不感兴趣?如果有超过2个带有键a的对象,输出应该是什么?你是否在寻找过滤值的集合集合? - Ilja Everilä