Angular 无法读取属性';从'开始;未定义的?

Angular 无法读取属性';从'开始;未定义的?,angular,Angular,我使用startWith时遇到问题。我收到这个错误: 无法读取未定义的属性“startsWith” 我有array内部array。因此,imforeach第一个数组,我在里面找到了array项。在项中我有属性项。现在我使用自动完成,所以当我进入测试,以获得所有数据与测试。任何关于我做错了什么的建议?尝试扩展lambda函数,使其具有适当的主体,并调试代码(正如@Oliver提到的),以发现任何可能的数据不一致 不过,我可以看到您的代码存在另一个问题。在forEach的每次迭代中,您都会覆盖结果变

我使用startWith时遇到问题。我收到这个错误:

无法读取未定义的属性“startsWith”


我有
array
内部
array
。因此,im
foreach
第一个数组,我在里面找到了
array
项。在
项中
我有属性
。现在我使用自动完成,所以当我进入测试,以获得所有数据与测试。任何关于我做错了什么的建议?

尝试扩展lambda函数,使其具有适当的主体,并调试代码(正如@Oliver提到的),以发现任何可能的数据不一致

不过,我可以看到您的代码存在另一个问题。在
forEach
的每次迭代中,您都会覆盖
结果
变量。这意味着当外部循环完成时,
结果将只包含循环遇到的最后一个数组。数组可以是空的,因为您的筛选器可能找不到要放在那里的内容。我建议使用
map
函数进行这样的转换,或者
flatMap
以防最终不再需要数组

像这样的方法应该会奏效:

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);
    }
  });
}

本质上,它的意思是,
entry['items']
中的一个或所有项对于匹配的筛选器是未定义的,您的
a['item']
a['service']
a['phoneNum']
?可能会有帮助的是,不要调用
startsWith()
来打印
entry['items']
和所有筛选的项目,而是首先将它们打印到控制台,以调试您实际收到的预期项目。@Fran这也是我的第一个想法。但是他使用
a['item']检查条目是否存在?一个['item'].startsWith()…
,因此此错误永远不会发生。最后,我建议大致相同。将lambda扩展到函数体(在胖箭头后使用大括号),并添加一个
console.log()
(或
debugger;
)可能由一个if语句包围,这取决于必须找到根本原因的条目的数量。这就是tnx:)
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);