基于项目数组的链执行方法

时间:2018-09-18 13:02:05

标签: javascript firebase google-cloud-firestore

甚至不确定如何为这个问题加上标题。提前为此道歉。

基本上,我有一系列选中的项目,如下所示:

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 个答案:

答案 0 :(得分:2)

您需要同时知道要查询的字段的名称和要过滤的值。在您共享的代码中,您仅显示名称,但在我的回答中,我假设您还具有值列表。

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(...

答案 1 :(得分:1)

也许这样会有所帮助:

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
  );

您可以使用过滤器项的value属性(或它的索引,以便您知道在选中/未选中时要设置的值),而不是将复选框分配给checked_items