首页 > 解决方案 > 有没有更好的方法来遍历一个大数组来查找每个项目的数量?

问题描述

我有一个 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数组中。

不是特别复杂,它确实有效。我想知道是否有更好,更短的方法来做到这一点。

标签: javascriptarraysloops

解决方案


您可以使用比数组 (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`)
})


推荐阅读