Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 从约束列表生成所有可能的对象_Javascript_Algorithm - Fatal编程技术网

Javascript 从约束列表生成所有可能的对象

Javascript 从约束列表生成所有可能的对象,javascript,algorithm,Javascript,Algorithm,我试图从约束哈希生成所有可能的对象 假设约束条件是: { key1: [ 'possible value1' , 'possible value2' ], key2: [ 2, 4, 7, 1], ... } 我想制造出所有可能的物体: { key1: 'possible value1', key2: 2 } { key1: 'possible value1', key2: 4 } ... 有人能给我指出正确的方向吗 谢谢大家! var选项={ 键1:['可能值

我试图从约束哈希生成所有可能的对象

假设约束条件是:

{
    key1: [ 'possible value1' , 'possible value2' ],
    key2: [ 2, 4, 7, 1],
    ...
}
我想制造出所有可能的物体:

{ key1: 'possible value1', key2: 2 }

{ key1: 'possible value1', key2: 4 }

...
有人能给我指出正确的方向吗

谢谢大家!

var选项={
键1:['可能值1','可能值2'],
键2:[2,4,7,1],
键3:['TEST1','TEST2']
};
函数GetCompositions(选项、选项索引、结果、当前){
var allKeys=Object.keys(选项);
var optionKey=allkey[optionIndex];
var VAL=选项[optionKey];
对于(变量i=0;i
let约束={
键1:[“可能值1”,“可能值2'],
键2:[2,4,7,1],
键3:[“foo”,“bar”],
};
让结果=Object.keys(约束)。减少(
(附件,钥匙)=>
acc.map(a1=>
约束[key].map(a2=>
a1.混凝土([a2])
)
).reduce((e1,e2)=>e1.concat(e2)),
[[]]
);

log(JSON.stringify(result))我知道有更优雅的方法可以做到这一点,但我想提出一种不需要太多思考的算法,因此,我的想法只是使用一个基本的
while
循环,循环的每次迭代都会创建下一个组合,并将其粘贴到输出数组中

我首先创建一个
keys
数组,该数组以
{k:“key1”,index:0,length:2}
的形式包含每个键的一个对象-基本上跟踪我们在其数组中使用的索引,以及其数组的长度。然后
while
循环的第一行使用
.reduce()
使用每个键的当前索引中的值构建对象,然后使用
for
循环移动到下一个组合。当它到达组合的末尾时,它会中断
while
循环

const约束={
键1:['pv1','pv2','pv3','pv4'],
键2:[2,4,7,1],
键3:['a','b'],
键4:[10,20,30]
}
常量输出=[]
常量键=对象键(约束)
.map(k=>({k:k,索引:0,长度:约束[k].length}))
进程:while(true){
输出.按下(按键.减少)(a,c)=>{
a[c.k]=约束[c.k][c.index];
返回a;
}, {}))
对于(设i=keys.length-1;i>=0;i--){
键[i].索引++
如果(键[i]。索引<键[i]。长度)中断
如果(i==0)中断进程
键[i]。索引=0
}
}
console.log(JSON.stringify(输出))
请参阅。在您的例子中,它们是对象属性,但这没有什么区别