技术解析

来试试最少的 JS 代码完成收集 V2EX 上的 at 人列表
0
2021-09-02 04:40:18
idczone

想搞个 V2 的线下聚会,要收集一整页参与评论的人员(不重复),然后一次 at 完

码农嘛,整天想玩玩自己的代码搞事情

突发奇想搞个小比赛,要求如下:

  • 收集一整页的参与评论的人员
  • 人员的 username 不能重复
  • 代码最少、逻辑简洁(不考虑 JS 压缩后的最少,为了观赏性,至少保留换行,能保留空格更好)

我自己写一个,抛砖引玉吧

Object.keys($('#Main .box .dark').toArray().reduce(function(obj, c) {
	obj['@' + $(c).text()] = 1;
	return obj;
}, {})).join('\n')

正在 V2 摸鱼的同学,线上打怪任务来了!

哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈


都用 JQuery 了,几千行是有了吧。

竟然无言以对........

```javascript
document
.querySelectorAll('.box .dark')
.map(el => `@${el.innerHtml}`)
.join('\n')
```

[...new Set(Array.from(document.querySelectorAll('.box .dark')).map(o=>(`@${o.text}`)))].join("\n")


1 document.querySelectorAll 结果不是 array
2 没有去重复


[...document.querySelectorAll('.box .dark')]
.map(el => `@${el.text}`)
.join('\n')

[].slice.call($$('a.dark')).reduce((all, it) => {
if (!all.includes('@' + it.text)) {
all.push('@' + it.text)
}
return all;
}, []).join(' ');
学习了

不要 at 我看看

没有 at 的也会算上啊


是的,没有试一下,还忽略了去重
[
...new Set(
[...document.querySelectorAll('.box .dark')].map(el => `@${el.text}`)
)
].join('\n')
你的差不多是最优解了

Chrome 控制台版本,可以省去冗长的 document. querySelectorAll
另外缩减了一下选择器长度,跑了几个帖子貌似没啥问题 2333
[...new Set($$('.dark').map(i => `@${i.text}`))].join('\n')

学习了

在 v2 你甚至可以玩 codegolf ……
61 bytes
[...new Set($$('.dark').map(e=>"@"+e.text))].join('\n')
注意模板字符串只有在两边都有添加文本的时候更短

这里统计的是参与评论主贴的人员,如果参与评论主贴的回复内容里面还 at 了其他人员的话,这个我是没有考虑到的
如果需要全部计算整个主贴下面的评论人员,含回复内容内 at 的,应该思路也是差不多的,就是筛选一下回复内容里面的 at 吧
你可以尝试实现以下~ :)

数据地带为您的网站提供全球顶级IDC资源
在线咨询
专属客服