Underscore.js where操作符未按预期工作问题咨询
_.where 未按预期工作的问题 哎,我之前也碰到过Underscore.js的_.where抽风的情况,结合你给出的Spotify Track数据,咱们一步步排查问题哈!
首先得明确_.where的核心逻辑:它会遍历数组,返回所有完全匹配你传入的顶层键值对的对象。结合你的场景,常见的问题和解决办法如下:
1. 类型不匹配导致匹配失败
这是最容易踩的坑!比如你的track_number、disc_number都是数字类型,但如果你用字符串去匹配,就会完全找不到结果:
❌ 错误示例:
// 注意这里track_number是字符串"1",但实际数据里是数字1 _.where(album.tracks.items, { track_number: "1" });
✅ 正确做法:
确保匹配值的类型和数据里的一致:
_.where(album.tracks.items, { track_number: 1 });
可以先打印一条数据确认类型:
console.log(typeof album.tracks.items[0].track_number); // 正常应该输出"number"
2. 试图匹配嵌套属性(_.where做不到)
_.where只能处理顶层属性,如果你想匹配比如external_urls.spotify这种嵌套属性,直接用where会失效:
❌ 错误示例:
// 这样写完全找不到结果,因为where只会找顶层的external_urls属性等于整个对象的项 _.where(album.tracks.items, { external_urls: { spotify: "xxx" } });
✅ 正确做法:改用_.filter配合自定义判断函数:
_.filter(album.tracks.items, function(track) { return track.external_urls.spotify === "https://open.spotify.com/track/5dcQ8zP4ruXLGvxvnaqiIR"; });
3. 数据还没加载完成就调用_.where
如果你的album.tracks.items是通过异步请求(比如Spotify API)获取的,可能在调用_.where时,数据还没返回,此时数组是空的或者undefined,自然返回空结果。
✅ 解决办法:
确保在数据加载完成后再执行查询,比如放在API回调或者async/await的await之后:
// 假设用fetch请求Spotify API fetch("你的Spotify API地址") .then(res => res.json()) .then(album => { // 这里数据已经加载完成,再调用where const matchedTracks = _.where(album.tracks.items, { disc_number: 1 }); console.log(matchedTracks); });
4. 属性名拼写错误
别笑,这真的是高频错误!比如把disc_number写成discNumber,或者track_number写成trackNum,导致完全匹配不到。
✅ 解决办法:
先打印一条数据确认属性名:
console.log(Object.keys(album.tracks.items[0])); // 会输出所有顶层属性名,核对你要匹配的键名是否正确
测试用例
用你给出的那条track数据,咱们写个测试验证:
const tracks = [{ "disc_number": 1, "duration_ms": 220613, "explicit": false, "id": "5dcQ8zP4ruXLGvxvnaqiIR", "name": "It Ain't Love (feat. Lil Mo)", "track_number": 1 }]; // 正确匹配disc_number=1的项 const result = _.where(tracks, { disc_number: 1 }); console.log(result); // 会返回这条track对象
如果还是不行,你可以把你实际调用_.where的代码贴出来,咱们再进一步排查!
内容的提问来源于stack exchange,提问作者Ridhwaan Shakeel

