使用键空白值过滤JavaScript对象数组

时间:2017-08-31 22:00:45

标签: javascript angularjs arrays

我有一个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: ""}

当我希望完全忽略此键并仅搜索具有与之关联的值的键时,过滤器将尝试将数组中的对象与空字符串匹配。我怎样才能进入最后一步?

2 个答案:

答案 0 :(得分:1)

您可以检查该键的值是否为空:

function searchQuery(place){
   return Object.keys(this).every((key) => place[key] === this[key] && this[key]);
}

因为""0nullundefined评估为假。

答案 1 :(得分:0)

(place[key] === this[key]) || (this[key] === '')怎么样?或者,如果您不需要检查字符串是否严格相等,请使用String(place[key]).includes(this[key])