2017-09-05 13 views
-1
search(event) { 
    this.autocompletedata.forEach((entry) => { 
    if (this.showFilter === '1') { 
     this.results = entry['items'].filter(a => a['item'] ? a['item'].startsWith(event.query) : false); 
    } else if (this.showFilter === '2') { 
     this.results = entry['items'].filter(a => a['service'] ? a['service'].startsWith(event.query) : false); 
    } else { 
     this.results = entry['items'].filter(a => a['phoneNum'] ? a['phoneNum'].startsWith(event.query) : false); 
    } 
    }); 
} 

我有一個問題,當我使用startWith。即時得到這個錯誤:無法讀取未定義的屬性'startsWith'?

Cannot read property 'startsWith' of undefined

arrayarray。因此,即時通訊foreach第一陣列和裏面我找到項目arrayitems我有財產item。現在即時通訊使用自動完成,所以當我進入測試,以獲得測試所有數據。任何建議什麼即時做錯了?

+2

這意味着在本質上那是什麼的一個或全部在'項中的項目[「項目」]的'是不確定的匹配濾波器,無論是你的'一[ 'item']','a ['service']'或'a ['phoneNum']'?可能有所幫助的不是調用'startsWith()'將print ['items']'和所有過濾的項目打印到控制檯,以調試實際接收預期項目的開始。 – Nope

+1

@Fran這也是我的第一個想法。但是他通過使用'a''item']檢查條目是否存在?一個['item']。startsWith()...',所以這個錯誤不應該發生。最後我會建議主要是一樣的。將你的lambda擴展到一個函數體(在胖箭頭後面使用花括號)並添加一個'console.log()'(或'debugger;'),可能被一個if語句包圍,這取決於你需要找到多少條目原因。 – Oliver

+0

這就是它tnx :) – None

回答

0

努力擴大你的lambda函數有一個適當的身體和調試代碼(如@Oliver提到)找到任何可能的數據不一致。

我可以看到你的代碼的另一個問題雖然。在你的forEach的每一次迭代中,你都會覆蓋你的results變量。這意味着由外環將已經完成的時候,results將只包含最後一個數組循環絆倒。數組可以是空的,因爲你的過濾器可能沒有發現任何東西。我建議使用map功能對於這樣的轉變,或flatMap如果你不再需要陣列中端陣列。

像這樣的東西應該工作:

var data = [ 
    {items: [{item: 'a', service: 'a', phone: 'a'},{item: 'b', service: 'b', phone: 'b'}]}, 
    {items: [{item: 'a', service: 'a', phone: 'a'},{item: 'b', service: 'b', phone: 'b'}]} 
]; 

var getFilter = prop => { return e => { return e[prop] && e[prop].startsWith(query) } }; 
var filters = { 1: getFilter('item'), 2: getFilter('service'), 3: getFilter('phone')}; 

var query = 'a', showFilters = 1; 
var results = data.map(entry => { return entry['items'].filter(filters[showFilters]) }); 

console.log(results); 

// flatMap is not on Array.prototype, you can define it yourself 
Array.prototype.flatMap = f => { return this.map(f).reduce((x,y) => { return x.concat(y) }, []) }; 

results = data.flatMap(entry => { return entry['items'].filter(filters[showFilters]) }); 

console.log(results); 
相關問題