代码之家  ›  专栏  ›  技术社区  ›  gugateider

基于项数组在链中执行方法

  •  1
  • gugateider  · 技术社区  · 7 年前

    甚至不知道如何命名这个问题。为此提前道歉。

    基本上,我有一个检查项数组,如下所示:

    const checked_items = ['brand', 'frame_gender', 'sku'...];
    

    我想查询FireBase数据集,如下所示:

    db.collection('glasses')
      // .where('brand' , '==' , 'brand')
      // .where('frame_gender' , '==' , 'Male')
      // .where('sku' , 'array-contains' , 'sku-here')
      .get()
      .then( (snapshot) => ... 
    

    基于我的项目数组链接这些方法的最有效方法是什么?有什么小窍门吗?如果不清楚,我可以进一步澄清。

    谢谢

    2 回复  |  直到 7 年前
        1
  •  1
  •   HMR    7 年前

    也许这样会有帮助:

    const filter = [
        { key: 'brand', op: '==', value: 'brand' },
        { key: 'frame_gender', op: '==', value: 'Male' },
        { key: 'sku', op: 'array-contains', value: 'sku-here' },
    ];
    //...
    const filteredQuery = filter
      .filter(item=>item.value!==undefined)
      .reduce(
        (query,{key,op,value})=>query.where(key,op,value),
        query
      );
    

    而不是将复选框分配给 checked_items 您可以使用筛选项的Value属性(或者它是索引,这样您就知道在选中/未选中时要设置什么值)

        2
  •  2
  •   Frank van Puffelen    7 年前

    您需要知道要查询的字段的名称和要筛选的值。在您共享的代码中,您只显示名称,但在我的答案中,我假设您还具有值列表。

    const checked_items = ['brand', 'frame_gender', 'sku'];
    const checked_values = ['brand', 'Male', 'sku_here'];
    

    现在,您可以循环访问字段名,并为每个字段创建一个新查询。

    var query = db.collection('glasses');
    checked_items.forEach(function(field, index) {
        var value = checked_values[index]);
        query = query.where(field, "==", value);
    });
    query.get().then(...