我正在使用第三方API,允许我搜索住房物业.遗憾的是,API不是以允许我搜索范围的方式编写的,因此我必须对范围中的每个值单独调用.
因此,如果我想搜索所有有2或3间卧室的房屋,我将不得不打电话给2间卧室,然后再打3间卧室.现在这可能变得非常棘手,因为有多个字段可以包含一系列数字(卧室,浴室,地板,车库大小……).
我的强力JavaScript解决方案是创建一个嵌套的for循环,它将创建一个包含所有调用的数组.这不是一个可扩展的解决方案,我正在寻找一种方法来动态创建这个for循环或另一种方法来获取我所有调用的数组.
我目前的解决方案
const searchParams = {
minBedrooms: 2,
maxBedrooms: 4,
minBathrooms: 1,
maxBathrooms: 3,
minFloors: 1,
maxFloors: 1
};
let promises = [];
for (let bedrooms = searchParams.minBedrooms; bedrooms <= searchParams.maxBedrooms; bedrooms++) {
for (let bathrooms = searchParams.minBathrooms; bathrooms <= searchParams.maxBathrooms; bathrooms++) {
for (let floors = searchParams.minFloors; floors <= searchParams.maxFloors; floors++) {
promises.push(callApi(bedrooms, bathrooms, floors));
}
}
}
Promise.all(promises).then(response => {
// do stuff with response
}
此外,用户可能不指定搜索参数之一(即 – 卧室数).因此,API不会应用该特定过滤器.我的代码当前将失败,没有传入卧室值,并且为每个for循环写入条件语句不是我的愿望.
关于如何动态生成上述嵌套for循环的任何想法?
编辑
如果用户没有指定卧室数量但指定浴室/楼层,我的当前解决方案将失败,因为循环的初始化将无法运行.我不想使用条件语句和许多嵌套循环来创建我的promise数组.这就是为什么我觉得我需要使用动态生成的for循环.
解决方法:
一种看待这种情况的方法叫做笛卡尔乘积A×B×C – 对于A中的每个a和B中的b和C中的c,你想要一个元组(a,b,c).
例如,{1,2}×{3,4}具有4个结果元组:(1,3),(1,4),(2,3),(2,4).
产生这个的最简单方法是从第一组中的选项开始:(1)和(2).然后,对于第二组中的每个选项,使用新值完成每个元组:
>(1),(2)加3得到(1,3)和(2,3)
>(1),(2)加4得到(1,4)和(2,4)
在代码中,这可能如下所示:
// Each key is associated with the set of values that it can take on
const properties = {
"bedrooms": [2, 3],
"bathrooms": [1, 2],
"floors": [1, 2, 3, 4],
}
// Start with a single "empty" tuple
let tuples = [{}]
for (let p in properties) {
// For each property, augment all of the old tuples
let nextTuples = []
for (let option of properties[p]) {
// with each possible option
nextTuples = nextTuples.concat(tuples.map(old => ({[p]: option, ...old})))
}
tuples = nextTuples;
}
元组最终结束了
[
{
"floors": 1,
"bathrooms": 1,
"bedrooms": 2
},
{
"floors": 1,
"bathrooms": 1,
"bedrooms": 3
},
......
{
"floors": 4,
"bathrooms": 2,
"bedrooms": 3
}
]
标签:javascript
来源: https://codeday.me/bug/20190727/1549922.html