【发布时间】:2017-02-11 02:04:05
【问题描述】:
我有一个对象数组,例如
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"}]
];
如果没有阶乘级别的计算量,我无法找到达到预期结果的方法(假设 input.length 可能远大于 2 或 3 — 甚至 15–20 可能还不够),这在物理上是不可能的.有没有办法获得一些合理的性能来解决这样的问题?
重要提示:是的,显然,对于相对较大的 input.length 值,理论上可能有非常大的数字可能的组合,但在实践中,result.length 总是相当小(可能 100-200,我什至怀疑它能否达到 1000...)。但为了安全起见,我只想设置一些限制(比如 1000),这样只要result.length 达到这个限制,函数就会返回当前的result 并停止。
【问题讨论】:
-
@DavinTryon:第 1 步。检查
arr是否包含{"ab":value}。如果是,获取下一个{"bc":value}并将它们都放入result。步骤 2. 检查arr是否包含{"bc":value}。如果是,请获取下一个{"ab":value}并将它们都放入result。依此类推,这需要一个阶乘级别的可能情况。 -
过于复杂。 IMO 你应该改变你的数据模型,这样你就不会遇到数据过滤/转换的问题。
-
您能否详细说明您的方法应该如何以及为什么应该为
["a", "a", "ab"]生成示例输出? “算法”应该如何决定一个值是第一个 a 还是后者的一部分?先扫描input然后判断a不止1个,剩下的应该由后者接收?或者您是否真的在寻找每个键的已找到对象的乘积? -
@Ilja Everilä:“算法”应该如何决定一个值是第一个 a 还是后者的一部分?先扫描输入,然后确定有不止1个a,后者应该收到其余的吗? // 输入中可能有重复的字符串这一事实根本不重要。
result[i+1]与result[i]不同吗?是的。这才是最重要的。 -
与
[{"a": "x"}, {"a": "nm"}, {"ab": "4"}]和[{"a": "x"}, {"a": "nm"}, {"ab": "i"}]相比,[{"a": "nm"}, {"a": "x"}, {"ab": "4"}]不是“独一无二的”,还是您对订单不感兴趣?如果有超过 2 个带有键 a 的对象,输出应该是什么?您在寻找过滤值的集合吗?
标签: javascript arrays algorithm search sub-array