【问题标题】:Filter objects against multiple values, only returning perfect matches根据多个值过滤对象,只返回完美匹配
【发布时间】:2019-10-15 22:12:12
【问题描述】:

我有一组配方对象,每个都包含一个带有值数组的 ingredients 键 - 像这样:

'soup': {'ingredients': ['carrot', 'pepper', 'tomato']}, 
'pie': {'ingredients': ['carrot', 'steak', 'potato']}, 
'stew': {'ingredients': ['steak', 'pepper', 'tomato']}

对于每个配方,我想获取一个值数组并查询 ingredients 数组 - 只返回匹配 all 值的配方。

例如:

var shoppingList = ['carrot', 'steak', 'tomato', 'pepper']

// returns: soup, stew

我尝试过使用Array.prototype.filter(),它返回包含任何所查询值的对象。但我只需要返回包含 all 值的对象。

换句话说,如果我没有土豆,别告诉我我可以做馅饼。

数据最初来自 Firebase 查询,但 AFAIK 无法使用 Firebase 执行此服务器端。

提前致谢。

【问题讨论】:

  • 您使用的是哪种数据库产品? Cloud Firestore 还是实时数据库?请编辑问题以显示代码和(更详细的)数据库结构未按您预期的方式工作。
  • “我尝试过使用Array.prototype.filter(),它返回的对象包含任何所查询的值。”你能添加你的内容吗?你试过这个问题吗?
  • @3limin4t0r 我认为他们想在 Firebase 中查询,而不是在代码中过滤,尽管这可能是一种选择。

标签: javascript arrays firebase


【解决方案1】:
  1. 使用Object.entries 从对象中提取键值对
  2. Array#everyArray#includes 过滤掉shoppingList 中没有所有ingredients 的任何人。
  3. 使用Array.map 只获取密钥。

var recipes = {
  'soup': {'ingredients': ['carrot', 'pepper', 'tomato']}, 
  'pie': {'ingredients': ['carrot', 'steak', 'potato']}, 
  'stew': {'ingredients': ['steak', 'pepper', 'tomato']}
};

var shoppingList = ['carrot', 'steak', 'tomato', 'pepper']

var result = Object.entries(recipes)//1. get the key-value pairs
  .filter(([key, {ingredients}]) => ingredients.every(t => shoppingList.includes(t))) //2. filter them
  .map(([key]) => key) //3. get the keys only

console.log(result);

【讨论】:

    【解决方案2】:

    .filter() 回调中使用.every().includes()

    return query.every(q => obj.taggedItems.includes(q))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-14
      • 2021-12-29
      • 1970-01-01
      • 1970-01-01
      • 2013-11-23
      • 2021-11-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多