我们可以将.filter()函数与条件规则一起用于搜索到的属性吗?

时间:2019-03-05 13:13:42

标签: javascript typescript ecmascript-6 filter

我们假设我们具有以下.filter函数:

search(searchQuery: string) {
  let results = myArray.filter(item => 
    item.title.toLowerCase().includes(searchQuery) ||
    item.description.toLowerCase().includes(searchQuery)
  );

  return results;
}

在此示例中,我们可以认为item并不总是具有description属性,而只是有些时候。 在这种情况下,函数将失败并显示错误:

  

错误TypeError:无法读取未定义的属性“ toLowerCase”

我们如何仍然可以在数组中搜索并仅在搜索中包含description属性?在.filter()函数中可以做到吗?

3 个答案:

答案 0 :(得分:5)

您可以采用默认值。

直接选择

(item.description || '').toLowerCase().includes(searchQuery)

或使用默认值进行销毁。

results = myArray.filter(({ title = '', description = '' }) => 
    title.toLowerCase().includes(searchQuery) ||
    description.toLowerCase().includes(searchQuery)
);

答案 1 :(得分:1)

您可以执行以下操作:

const myArray = [
    {
        title: 'Test 123',
    },
    {
        title: 'Test 123',
        description: 'test',
    },
    {
        title: 'What',
    },
    {
        title: 'Fix',
        description: '456123',
    },
];

const search = (text) => {
    let results = myArray.filter(item => {
        if (item.description) {
            return item.title.toLowerCase().includes(text) || item.description.toLowerCase().includes(text);
        }
    });
  
    return results;
}

const results = search('test');

console.log(results);

答案 2 :(得分:0)

search(searchQuery: string) {
  return myarray.filter(item => 'description' in item
    ? item.description.toLowerCase().includes(searchQuery)
    : item.title.toLowerCase().includes(searchQuery)
  );
}

可能也想对title做同样的检查,但是您走了多远。

相关问题