我有一个HTML表单,其中不同的输入文本框绑定到AngularJS搜索对象,即
<input ng-model="search.state_prov">State</input>
<input ng-model="search.zip">Zip</input>
<input ng-model="search.country"></input>
我有一大堆对象,例如:
places = [{name: place1, state_prov: MO, zip: 63101, country: US},
{name: place2, state_prov: CA, zip: 90210, country: US},
{name: place3, state_prov: AB, zip: T0A, country: CA}
{name: place4, state_prov: CA, zip: 90001, country: US}
]
我正在尝试根据表单中输入的输入过滤此数组(搜索)。初始化表单时,“搜索”对象为空。一旦用户开始输入文本框,例如state_prov,搜索对象就会获取search.state_prov的新密钥,其值为框中输入的内容。
然后我可以在places数组中搜索匹配项,我可以使用这个array.filter()原型进行搜索:
var result = places.filter(searchQuery, query);
function searchQuery(place){
return Object.keys(this).every((key) => place[key] === this[key]);
}
我的问题是,如果用户填写两个文本框,然后清除其中一个希望仅通过仍包含数据的文本框进行搜索,则“搜索”对象仍将具有用于删除输入的键空字符串的值。
search = {state_prov: "CA", zip: ""}
当我希望完全忽略此键并仅搜索具有与之关联的值的键时,过滤器将尝试将数组中的对象与空字符串匹配。我怎样才能进入最后一步?
答案 0 :(得分:1)
您可以检查该键的值是否为空:
function searchQuery(place){
return Object.keys(this).every((key) => place[key] === this[key] && this[key]);
}
因为""
,0
,null
和undefined
评估为假。
答案 1 :(得分:0)
(place[key] === this[key]) || (this[key] === '')
怎么样?或者,如果您不需要检查字符串是否严格相等,请使用String(place[key]).includes(this[key])
。