2017-08-31 18 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]」。 –