JS动态生成循环

Jon*_*Jon 3 javascript

我正在使用第三方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
}
Run Code Online (Sandbox Code Playgroud)

此外,用户可能不指定搜索参数之一(即 - 卧室数).因此,API不会应用该特定过滤器.我的代码当前将失败,没有传入卧室值,并且为每个for循环写入条件语句不是我的愿望.

关于如何动态生成上述嵌套for循环的任何想法?


编辑

如果用户没有指定卧室数量但指定浴室/楼层,我的当前解决方案将失败,因为循环的初始化将无法运行.我不想使用条件语句和许多嵌套循环来创建我的promise数组.这就是为什么我觉得我需要使用动态生成的for循环.

Cur*_*ner 6

看看这一种方法被称为笛卡尔积A × B × C-为每一个aAbBcC,你想有一个元组(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;
}
Run Code Online (Sandbox Code Playgroud)

tuples像结束了

[
    {
        "floors": 1,
        "bathrooms": 1,
        "bedrooms": 2
    },
    {
        "floors": 1,
        "bathrooms": 1,
        "bedrooms": 3
    },
    ......
    {
        "floors": 4,
        "bathrooms": 2,
        "bedrooms": 3
    }
]
Run Code Online (Sandbox Code Playgroud)