2017-08-31 17 views
1

我有一个HTML形式,其中不同的输入文本框被绑定到一个AngularJS搜索对象,即价值,滤波的JavaScript阵列的钥匙坯料

<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获取一个新的密钥,其值为框中键入的值。

然后我就可以搜索的地方数组中的比赛,我已经能够使用该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

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

+0

这对我有效!我还非常感谢关于比较类似字符串而不是明确的平等的额外建议。我喜欢结果给我。 –

1

您可以检查,看看是否在该键的值不为空:

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

因为""0nullundefined评估为假。

+0

如果'this [key]'是'undefined'或'null',则会导致错误,请注意。 – Georgy

+0

这不适合我。这可能是我提出这个问题的方式。由于它正在查看'place [key] === this [key]',所以当'place [key] ==='''我仍然希望它在'this [key] ==='ABC时返回值“'。当它是一个空字符串时,我想完全忽略“place [key]”。 –