V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐关注
Meteor
JSLint - a JavaScript code quality tool
jsFiddle
D3.js
WebStorm
推荐书目
JavaScript 权威指南第 5 版
Closure: The Definitive Guide
mywaiting
V2EX  ›  JavaScript

来试试最少的 JS 代码完成收集 V2EX 上的 at 人列表

  •  
  •   mywaiting · 2018-12-25 15:12:35 +08:00 · 3166 次点击
    这是一个创建于 2162 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

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

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

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

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

    14 条回复    2018-12-25 16:39:01 +08:00
    jera
        1
    jera  
       2018-12-25 15:24:40 +08:00   ❤️ 1
    都用 JQuery 了,几千行是有了吧。
    mywaiting
        2
    mywaiting  
    OP
       2018-12-25 15:30:14 +08:00
    @jera 竟然无言以对........
    johnnyNg
        3
    johnnyNg  
       2018-12-25 15:30:53 +08:00
    ```javascript
    document
    .querySelectorAll('#Main .box .dark')
    .map(el => `@${el.innerHtml}`)
    .join('\n')
    ```
    yuanfnadi
        4
    yuanfnadi  
       2018-12-25 15:36:11 +08:00
    [...new Set(Array.from(document.querySelectorAll('#Main .box .dark')).map(o=>(`@${o.text}`)))].join("\n")
    yuanfnadi
        5
    yuanfnadi  
       2018-12-25 15:37:11 +08:00
    @johnnyNg
    1 document.querySelectorAll 结果不是 array
    2 没有去重复
    johnnyNg
        6
    johnnyNg  
       2018-12-25 15:40:43 +08:00
    @johnnyNg

    [...document.querySelectorAll('#Main .box .dark')]
    .map(el => `@${el.text}`)
    .join('\n')
    royzxq
        7
    royzxq  
       2018-12-25 15:43:58 +08:00
    [].slice.call($$('#Main a.dark')).reduce((all, it) => {
    if (!all.includes('@' + it.text)) {
    all.push('@' + it.text)
    }

    return all;
    }, []).join(' ');

    #4 学习了
    123s
        8
    123s  
       2018-12-25 15:44:49 +08:00
    不要 at 我看看
    123s
        9
    123s  
       2018-12-25 15:45:08 +08:00
    没有 at 的也会算上啊
    johnnyNg
        10
    johnnyNg  
       2018-12-25 15:46:40 +08:00
    @yuanfnadi
    是的,没有试一下,还忽略了去重

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

    你的差不多是最优解了
    wildnode
        11
    wildnode  
       2018-12-25 15:51:44 +08:00
    Chrome 控制台版本,可以省去冗长的 document. querySelectorAll
    另外缩减了一下选择器长度,跑了几个帖子貌似没啥问题 2333

    [...new Set($$('#Main .dark').map(i => `@${i.text}`))].join('\n')
    jydeng
        12
    jydeng  
       2018-12-25 15:53:08 +08:00
    学习了
    no1xsyzy
        13
    no1xsyzy  
       2018-12-25 16:09:25 +08:00
    在 v2 你甚至可以玩 codegolf ……

    61 bytes
    [...new Set($$('#Main .dark').map(e=>"@"+e.text))].join('\n')

    注意模板字符串只有在两边都有添加文本的时候更短
    mywaiting
        14
    mywaiting  
    OP
       2018-12-25 16:39:01 +08:00
    @123s 这里统计的是参与评论主贴的人员,如果参与评论主贴的回复内容里面还 at 了其他人员的话,这个我是没有考虑到的

    如果需要全部计算整个主贴下面的评论人员,含回复内容内 at 的,应该思路也是差不多的,就是筛选一下回复内容里面的 at 吧

    你可以尝试实现以下~ :)
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5439 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 07:01 · PVG 15:01 · LAX 23:01 · JFK 02:01
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.