我需要一些帮助。我有一个数组dir -r | Select Mode,LastWriteTime,Length,Name,Fullname | Out-GridView
作为来自父级的道具收到的对象。我需要根据其对象属性(allGames
)等过滤此数组。用户可以在复选框,下拉列表或其他内容中输入过滤器值。我需要这些过滤器一起工作。
为此,我使用了两个额外的数组:一个名为venue, date, price
,用于保存过滤后显示的游戏,另一个名为filteredGames
,在输入时更新。
我设法使用以下代码正确过滤:
searchTerm
我遇到的问题是并非所有原始对象都是&#39;属性已填满。例如,游戏的<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
,搜索根本无效。
有没有办法在return中添加Error in callback for watcher "searchTerm": "TypeError: game.price is null"
语句?像if
?
我无法找到让它发挥作用的方法。如果不可能有替代方案吗?
我感谢任何帮助。
答案 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.search(this.searchTerm.price) >= 0)
);
它有效,因为在JavaScript中,true && expression
始终评估为expression
,而false && expression
始终评估为false.
修改即使1次搜索匹配,也使用||
返回true:
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)
);