我正在创建一个非常轻量级的搜索功能,它具有以下功能:
if (searchStr == people.first_name ||
searchStr == people.last_name ||
searchStr == people.job ||
searchStr == people.skills.forEach(function(x) { return x })) {
Results.push(people)
}
searchStr
是搜索字符串; 'people'是一个人对象,只有一个名字和一个姓名和一个作业,但只有一个数组是people.skills - 无论如何,我可以在if-conditional中通过匿名遍历该数组功能
答案 0 :(得分:6)
您可以使用Array.prototype.some
来评估数组中至少一个条目的条件是否为真。这比Array.prototype.filter
更好,因为它将在第一个条目的早期退出以评估为真。
if (searchStr == people.first_name ||
searchStr == people.last_name ||
searchStr == people.job ||
people.skills.some(function(x) { return searchStr == x })) {
Results.push(people)
}
Array.prototype.some
是Ecmascript 5中的新内容,即fairly well supported now。
通过将您的平等比较与Array.prototype.indexOf
切换,以查看字符串是否包含搜索字词,您可以通过部分字词搜索而非精确搜索来改进搜索。< / p>
if (contains(people.first_name, searchStr) ||
contains(people.last_name, searchStr) ||
contains(people.job, searchStr) ||
people.skills.some(function(x) { return contains(x, searchStr); })) {
Results.push(people)
}
function contains(a, b) {
return a.indexOf(b) >= 0;
}
答案 1 :(得分:3)
Array.prototype.some
方法可达到此目的:
if (searchStr == people.first_name ||
searchStr == people.last_name ||
searchStr == people.job ||
people.skills.some(function(skill) {
return searchStr == skill;
})) {
Results.push(people)
}
但在这种情况下,不需要使用匿名函数。我们可以使用Array.prototype.indexOf
方法:
if (searchStr == people.first_name ||
searchStr == people.last_name ||
searchStr == people.job ||
people.skills.indexOf(searchStr) != -1) {
Results.push(people)
}
或更具惯用性:
people.skills.indexOf(searchStr)+1
请注意,Array.prototype.every
,some
,forEach
,filter
,reduce
和reduceRight
方法是ECMAScript 5的一部分,因此,在仅支持ECMAScript&lt; = 3.1的旧浏览器中不支持。如果这是一个问题,您应该使用a polyfill。
答案 2 :(得分:2)
您可以使用indexOf来确定数组中是否存在使用javascript的值,如果您真的需要遍历数组,那么请使用像@DanielImms推荐的某些函数。
if (searchStr == people.first_name ||
searchStr == people.last_name ||
searchStr == people.job ||
people.skills.indexOf(searchStr)>-1) {
Results.push(people)
}
答案 3 :(得分:1)
另一种选择是使用Array.reduce()
,它返回一个值。
试试这个:
if (searchStr == people.first_name ||
searchStr == people.last_name ||
searchStr == people.job ||
people.skills.reduce(function(p,c) {
return p || (searchStr == c);
},false)
}
答案 4 :(得分:1)
var searchSkills = [].concat.apply([], people.skills);
if (searchStr == people.first_name ||
searchStr == people.last_name ||
searchStr == people.job ||
searchSkills.indexOf(searchStr) >= 0 {
Results.push(people)
}
为了后人的缘故,我会留下这个,但这种方法可能只有在people.skills
是多维的时候才有用。
作为旁注,我怀疑indexOf
的效果要比执行filter
map
或some
高得多。
答案 5 :(得分:1)
为了彻底,如果你处于最前沿并使用Ecmascript 7,你可以使用Array.prototype.includes()
In [1359]: x.max()[x.max() == x.max(axis=1).max()].index
Out[1359]: Index([u'11'], dtype='object')