我用打字稿编写了这段代码,该脚本在对象列表中搜索不完全相等的对象:
list = list.filter(
x => (x.surname + ' ' + x.name)
.trim()
.toLowerCase()
.search(filter.toLowerCase()) >= 0);
因此,如果我想搜索Alex并仅输入al
,则alex
将显示为有效结果。
当我在javascript代码库中移动此代码时,它完全坏了,有关搜索,trim()等的错误。
有没有一种方法可以在不编写循环的情况下实现此结果?
答案 0 :(得分:2)
您的代码看起来不错,并且适用于您描述的情况,除了old browsers that don't support arrow functions之外。
还请注意,search
将根据您传递给它的字符串创建一个 regex ,如果例如您经过一个简单的时期.
;如果您不希望这样做,则最好使用indexOf
。
这是两种方法的演示:
function findUsingSearch(list, filter) {
return list.filter(
x => (x.surname + ' ' + x.name)
.trim()
.toLowerCase()
.search(filter.toLowerCase()) >= 0);
}
function findUsingIndexOf(list, filter) {
return list.filter(
x => (x.surname + ' ' + x.name)
.trim()
.toLowerCase()
.indexOf(filter.toLowerCase()) >= 0);
}
var data = [{ surname: 'Alex', name: 'Foo' }, { surname: 'Oleg', name: 'Bar' }];
console.log('*** findUsingSearch:')
console.log(findUsingSearch(data, 'al'));
console.log(findUsingSearch(data, 'ol'));
console.log(findUsingSearch(data, 'ul'));
console.log(findUsingSearch(data, '.'));
console.log('*** findUsingIndexOf:')
console.log(findUsingIndexOf(data, 'al'));
console.log(findUsingIndexOf(data, 'ol'));
console.log(findUsingIndexOf(data, 'ul'));
console.log(findUsingIndexOf(data, '.'));
答案 1 :(得分:0)
假设我正确地阅读了问题,那么您有一个这样的对象数组:
const people = [
{ name: 'Dave', surname: 'Smith' },
{ name: 'Stevie', surname: 'Wonder' },
{ name: 'Alex', surname: 'Winter' }
];
您想搜索列表以查找与特定字符串部分(称为searchString
)匹配的人吗?应该这样做:
const result = people.find(
person => {
const name = person.name.toLowerCase();
const surname = person.surname.toLowerCase();
if (`${name}${surname}.includes(searchString.toLowerCase()) {
return person;
}
}
);
这可以包装成一行; SO片段中看起来有些笨拙,但这是:
const result = people.find(person => `${person.name.toLowerCase()}${person.surname.toLowerCase()}`.includes(searchString.toLowerCase()));
如果要返回所有匹配结果的数组,请将find
替换为filter
:
const result = people.filter(person => `${person.name.toLowerCase()}${person.surname.toLowerCase()}`.includes(searchString.toLowerCase()));