无法读取未定义的属性'startsWith'?

时间:2017-09-05 11:47:22

标签: angular

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'

我在arrayarray。所以im foreach第一个数组和内部我找到了array个项目。在items内,我有财产item。现在我使用自动完成,所以当我进入测试以获得所有数据与测试。有什么建议我做错了吗?

1 个答案:

答案 0 :(得分:0)

尝试扩展lambda函数以使其具有正确的正文并调试代码(如@Oliver提及的那样)以找到任何可能的数据不一致。

我可以看到你的代码的另一个问题。在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); 以防最终不再需要数组数组。

这样的事情应该有效:

{{1}}