javascript - v-显示嵌套数组项是否与过滤数组匹配

标签 javascript arrays vue.js ecmascript-5

我必须编写一个 Vue Web 应用程序,它将采用多个过滤器,将它们推送到一个数组,然后在单击方法上检查过滤器数组值,以及是否有任何值与图 block 嵌套数组内的任何嵌套值相匹配,显示匹配的图 block 。所以,我的过滤器数组可能有:

filters: ['cookies', 'jogging']

我的嵌套图 block 数组将具有:

tiles: [
 {
  "name": "Greg",
  "food": ["cookies", "chips", "burgers"],
  "activities": ["drawing", "watching movies"]
  "favourite places": ["the parks", "movie theatre"]
 },{
  "name": "Robyn",
  "food": ["cookies", "hotdogs", "fish"],
  "activities": ["reading", "jogging"]
  "favourite places": ["beach", "theme parks"]
 },{
  "name": "John",
  "food": ["sushi", "candy", "fruit"],
  "activities": ["writing", "planning"]
  "favourite places": ["the moon", "venus"]
 }
]

在上面的示例中,显示的图 block 将是 Robyn,因为她喜欢 cookies 和慢跑。

到目前为止,我的想法是编写一个 for 循环来检查嵌套数组内的值,这是我从这个解决方案中得到的:

https://stackoverflow.com/a/25926600/1159683

但是,我无法建立仅在 v-for/v-show 中显示项目的连接。我已经找到了将所有过滤器推送到过滤器数组的方法,但是当涉及到将其与嵌套数组匹配并根据匹配显示它们时,我不知所措。最好我想用 vanilla js (es5) 写出来。

感谢任何帮助。

谢谢!

最佳答案

computed: {
  fullyMatchedTiles () {
    // Matches must contain all terms from filter array

    return this.tiles.filter(obj=> {

      // Filter the filters to get matched count
      let matchedFilters = this.filters.filter(filterItem=> {

        // Check each property by looping keys
        for (key in obj) {

          // Only evaluate if property is an array
          if (Array.isArray(obj[key])) {

            // Return true if filterItem found in obj
            if (obj[key].some(r=> filterItem.indexOf(r) >= 0)) {
              return true
            }
          }
        }
      })
      return this.filters.length === matchedFilters.length
    }) 
  },

  partiallyMatchedTiles () {
    // Matches must contain at least one term from filter array
    // Check each object in the array
    return this.tiles.filter(obj=> {

      // Check each property by looping keys
      for (key in obj) {

        // Only evaluate if property is an array
        if (Array.isArray(obj[key])) {

          // Return true to the filter function if matched, otherwise keep looping
          if (obj[key].some(r=> this.filters.indexOf(r) >= 0)) {
            return true
          }
        }
      }
    })
  },
},

抱歉,这不是 es5。我非常喜欢这些新功能,不想花时间回到 5 年前。

有关显示 vue 中返回的过滤对象的完整示例,请检查此 codepen https://codepen.io/shanemgrey/pen/jOErWbe

我认为您正在描述在 v-for 中进行过滤。尝试使用 v-for 中可用的过滤来完成它似乎逻辑太复杂。

我会按照所示方法在新的计算属性中分解数组,然后在模板中使用生成的过滤数组。

关于javascript - v-显示嵌套数组项是否与过滤数组匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59296156/

相关文章:

javascript - 显示 JSON 响应

javascript - 如何调度多个 action creator(React + Redux + 服务端渲染)

javascript - Swift 到 JavaScript 的转译器——可能吗?

javascript - 在 Bootstrap 中更改事件列表项的背景颜色

javascript - 从 json 数组中删除元素而不重置其长度

javascript - javascript 中 Array.pop 的 FIFO 行为?

vue.js - 从类方法访问 Vue 变量的正确方法

java - 对另一个类中的非静态方法进行静态引用

vue.js - 在什么情况下会选择 v-text 而不是 "mustache"语法?

javascript - 来自其他文件的 Vue 中方法的 mixin