【问题标题】:Javascript if statement inside return返回内部的Javascript if语句
【发布时间】:2018-11-09 12:31:42
【问题描述】:

我需要一些帮助。我有一个数组allGames 作为来自父级的道具接收的对象。我需要根据它的对象属性(venue, date, price)等过滤这个数组。过滤器值将由用户在复选框、下拉列表或其他内容中输入。我需要这些过滤器一起工作。

为此,我使用了两个额外的数组:一个名为 filteredGames 来保存过滤后要显示的游戏,另一个名为 searchTerm 的数组在输入输入时更新。

我设法使用以下代码正确过滤:

<input type="text" name="date" v-model="searchTerm.date">
<input type="text" name="venue" v-model="searchTerm.venue">
<input type="text" name="price" v-model="searchTerm.price">

export defaults {
    props: {
      allGames: {
        type: Array,
        required: true
      }
    },
    data: function () {
      return {
        filteredGames: [],
        searchTerm: {
          venue: '',
          date: '',
          price: ''
        }
      }
    },
    watch: {
      searchTerm: {
        handler: function (val) {
          this.filterGames()
          this.$emit('input', val)
        },
        deep: true
      }
    },
    methods: {
      filterGames: function () {
        if (this.filteredGames.length === 0) { this.filteredGames = this.allGames }
        if (this.searchTerm.venue) { this.searchTerm.venue = this.searchTerm.venue.toLowerCase() }
        if (this.searchTerm && this.filteredGames) {
          this.filteredGames = this.allGames.filter(game => {
            return (
              game.venue.toLowerCase().search(this.searchTerm.venue) >= 0 &&
              game.date.search(this.searchTerm.date) >= 0 &&
              game.price.search(this.searchTerm.price) >= 0
            )
          })
        }
      }
    }
}

我遇到的问题是并非所有原始对象的属性都已填充。例如,游戏的price 列可能为空。发生这种情况时,我会收到 Error in callback for watcher "searchTerm": "TypeError: game.price is null" 并且搜索根本不起作用。

有没有办法在 return 中添加 if 语句? if (game.price) { game.price.search(this.searchTerm.price) &gt;= 0 } 之类的东西?

我找不到让它工作的方法。如果不可能,是否有替代方案?

感谢您的帮助。

【问题讨论】:

  • 你只在if 语句中返回,那么其他分支呢?如果您总是使用返回值,那么这可能是问题
  • 只有当用户对搜索词进行了更改并且已经定义了filteredGames 数组时,它才应该返回。否则它不应该返回任何东西。我认为这是正确的。我错过了什么吗?

标签: javascript search vue.js filter return


【解决方案1】:

你可以这样做,只有当属性是这样真实时才应用搜索:

这叫

短路评估

 return (
      (game.venue && game.venue.toLowerCase().search(this.searchTerm.venue) >= 0) &&
      (game.date && game.date.search(this.searchTerm.date) >= 0) &&
      (game.price && game.price.search(this.searchTerm.price) >= 0)
    );

之所以有效,是因为在 JavaScript 中,true &amp;&amp; expression 总是计算为 expression,而false &amp;&amp; expression 总是计算为 false.

编辑使用||返回true,即使1个搜索匹配:

return (
          (game.venue && game.venue.toLowerCase().search(this.searchTerm.venue) >= 0) ||
          (game.date && game.date.search(this.searchTerm.date) >= 0) ||
          (game.price && game.price.search(this.searchTerm.price) >= 0)
        );

编辑 2 仅过滤用户输入的所有值并忽略其他值:

return (
        (!game.venue || game.venue.toLowerCase().search(this.searchTerm.venue) >= 0) &&
        (!game.date || game.date.search(this.searchTerm.date) >= 0) &&
        (!game.price || game.price.toString().search(this.searchTerm.price) >= 0)
      );

【讨论】:

  • 对。谢谢,那行得通。现在我有另一个问题。不确定是否与此有关。我收到Error in callback for watcher "searchTerm": "TypeError: game.price.search is not a function" 并且搜索功能不再起作用。对于可以使用哪些类型的变量,搜索功能是否有任何限制?
  • @pharaohlxvi 如果价格是一个整数,你可以这样做 game.price.toString().search(this.searchTerm.price)
  • 完美!谢谢!它仍然没有给我我所期望的。当用户向venue 添加内容时,它会显示具有该值的游戏,这非常完美。问题是它不会显示在其他字段(例如price)字段中没有值的游戏,即使它具有预期的venue
  • 不确定是否清楚。我想要的是过滤器不考虑用户留空的文件。
  • 你的问题不清楚,你应该使用 ||运算符而不是 && 这样即使它在任何树条件中找到匹配项,它也会返回 true
猜你喜欢
  • 2016-10-06
  • 1970-01-01
  • 1970-01-01
  • 2021-03-04
  • 2011-04-12
  • 2015-03-22
  • 2016-03-26
  • 2015-07-28
  • 1970-01-01
相关资源
最近更新 更多