问题描述
我有这个对象数组:
obj=
[{name: 'joe',job: 'teacher',city: 'miami'},{name: 'bill',job: 'police',city: 'yorkshire'},{name: 'Sarah',job: 'driver',city: 'michigan'}]
<select v-model="selected">
<option>blue</option>
<option>green</option>
<option>black</option>
<option>all</option>
</select>
,然后如果选择其中之一,则将它们与数组中的对象关联:
if (selected === "blue") {
optionSelected = 'joe'
} else if (selected === "green") {
optionSelected = 'bill'
} else if (selected === "black") {
optionSelected = 'Sarah'
} else if (selected === "all") {
// what should go here?
}
我这样过滤掉它:
obj = obj.filter(object => object.name === optionSelected)
所以现在如果我选择blue
,我的obj
就变成了{name: 'bill',city: 'yorkshire'}
,依此类推,这很好。但是我不知道如何过滤all
。因此,选择obj
时将重置为包含所有值,例如:
obj=
[{name: 'joe',city: 'michigan'}]
我该怎么做?
请注意: 代码的架构是用这种方式设置的,我无法更改。
解决方法
我将从将颜色映射到名称的对象开始,这样您就可以避免使用所有if..else if
的东西
const colorNameMap = {
blue: 'joe',green: 'bill',black: 'sarah',all: false // totally optional since undefined is falsy
}
然后,您只需检查所选颜色是否与地图中的某些颜色匹配。如果不是,则返回整个obj
const name = colorNameMap[this.selected]
const filtered = name ? obj.filter(o => o.name === name) : obj