关于JavaScript谓词语法及Underscore.js findIndex用法的疑问
理解Underscore.js中对象作为谓词的语法
嘿,你说的完全没错!那两行代码的功能确实是一致的,Underscore.js这里用对象作为findIndex的谓词,其实是它提供的一个非常实用的语法糖(shorthand),专门用来简化简单的属性匹配场景。
核心原理
Underscore的很多迭代方法(包括findIndex、filter、find等)都支持这种语法:当你传入一个对象作为匹配条件时,Underscore会自动帮你生成一个谓词函数。这个函数的逻辑是:检查数组中的每个元素是否浅包含该对象的所有键值对(也就是每个对应键的值都严格相等===)。
比如你代码里的_.findIndex(this.photos, { id: id }),Underscore内部会把它转换成类似这样的函数:
_.findIndex(this.photos, (photo) => { return photo.id === id; });
和你手动写的箭头函数逻辑几乎一样,区别只是Underscore用的是严格相等,而你写的是松散相等==——不过在id都是数字或字符串的场景下,两者效果基本一致。
扩展用法
这种语法还支持同时匹配多个属性,比如你想找id等于目标值且状态为active的照片,直接传对象就行:
_.findIndex(this.photos, { id: id, status: 'active' });
Underscore会自动生成一个检查两个条件同时满足的谓词函数,省去了你手动写&&的麻烦。
注意局限性
不过要注意,这种匹配是浅匹配:如果你的对象里有嵌套属性,比如{ user: { name: 'Alice' } },这种方式就无法正确匹配了——因为它只会比较嵌套对象的引用是否相等,而不是比较内部的属性值。这种场景下,你还是得手动写自定义的谓词函数来做深匹配。
内容的提问来源于stack exchange,提问作者Tim
相关产品推荐
相关产品推荐

