javascript - 有没有更好的方法来遍历一个大数组来查找每个项目的数量?
问题描述
我有一个 JSON 文件,其中包含 20k 多个条目,其中包含 Spotify 上不同曲目的名称。我试图计算每首歌曲由特定艺术家播放的次数。
function countInArray(array, what) {
var count = 0;
for (var i = 0; i < array.length; i++) {
if (array[i] === what) {
count++;
}
}
nfPlays.push(count)
return count;
}
nfSongs2 = []
nfSongs = []
nfPlays = []
for(var i = 0; i < dta.length; i++) {
if(dta[i].artistName === "NF") {
nfSongs.push(dta[i].trackName)
}
}
for(var i = 0; i < dta.length; i++) {
if(nfSongs2.indexOf(dta[i].trackName) === -1 && dta[i].artistName === "NF") {
nfSongs2.push(dta[i].trackName)
}
}
for(var i = 0; i < nfSongs2.length; i++) {
console.log(`${nfSongs2[i]} has ${countInArray(nfSongs, nfSongs2[i])} plays`)
}
console.log(countInArray(nfSongs, "WHY"))
console.log(nfPlays)
console.log(nfSongs2)
console.log(nfSongs)
这是目前我的代码。基本上它所做的是遍历dta
数组并通过 NF(特别是轨道名称)获取所有条目,其中包括重复项,然后再次执行此操作,但这次只获取唯一名称。然后我运行countInArray
轨道的所有唯一名称,这些名称将获取播放次数并将其推送到nfPlays
数组中。
不是特别复杂,它确实有效。我想知道是否有更好,更短的方法来做到这一点。
解决方案
您可以使用比数组 (indexOf) 提供更快查找的 Map
const dta = [
{ trackName:'a', artistName:'NF' },
{ trackName:'a', artistName:'NF' },
{ trackName:'b', artistName:'NF' },
{ trackName:'b', artistName:'other' },
]
const trackNameToCount = dta.reduce((m, track) => {
if (track.artistName === 'NF') {
const n = m.get(track.trackName) || 0
m.set(track.trackName, n+1)
}
return m
}, new Map())
;[...trackNameToCount.entries()].forEach(([name, count]) => {
console.log(`${name} played ${count} times`)
})
推荐阅读
- laravel - 流明 + 学说:未定义 Auth guard []
- javascript - 带有 Expo-cli 的 Jestjs。Invariant Violation:元素类型无效
- c# - 向 Outlook 消息功能区添加按钮
- sql-server - SSMS 连接 SSIS 失败
- database - 内存数据库和关系数据库 + NoSQL 数据库有什么区别?
- java - Gradle 看不到 Spring 包,但声明了依赖项
- perl - 在运行的 Gtk3 Perl 应用程序中更改 TextView 小部件的字体大小
- spring-data-elasticsearch - 如何在没有索引的情况下使用 spring data elasticsearch 在 Elasticsearch 中存储字节数组字段?
- matlab - 如何在 Matlab 中为多个变量的超定二次系统找到 argmin/最佳拟合/优化
- java - Java 8+ ConcurrentHashMap 锁条带化