我们一起来做一道 JS 题目:在控制台打印 React 仓库的 Fork 列表

2017-07-11 13:34:36 +08:00
 bw2

要求


获取当前页面已 Fork 的成员列表,存储在数组。代码短,耗时少者更佳。返回数组长度应该是 1000。

地址

https://github.com/facebook/react/network/members

示例代码


// 时间和函数长度统计

function timeAndLengthCount(callback){
  const timeStart = new Date().getTime()
  callback()
  const timeEnd = new Date().getTime()
  console.log('Time: ' + (timeEnd-timeStart) + 'ms')
  console.log('Len: '+ callback.toString().length)
}

// 执行输出 Fork 成员列表的函数
// Time: 7ms
// Len: 223

timeAndLengthCount(()=>{
  const forkedMenber = document.querySelectorAll('.repo > a:nth-child(odd)');
  const forkedMenberList = [];
  [].forEach.call(forkedMenber, z => forkedMenberList.push(z.innerHTML));
  console.log(forkedMenberList);
})

接下来就是开始你的表演了

4581 次点击
所在节点    程序员
47 条回复
baconrad
2017-07-11 17:17:12 +08:00
@bw2 因為 start-of-content 會被理解為三個變數兩個運算符,
但仍然能用 window['start-of-content'] 來取得節點
bw2
2017-07-11 17:58:42 +08:00
@ctsed 厉害了,竟然有这种操作
bw2
2017-07-11 17:59:55 +08:00
@baconrad 对象里的['']用过,没想到在最外层还能直接执行[''],真是涨见识了
crs0910
2017-07-11 18:01:05 +08:00
innerText 需要判断 layout,会有额外的性能损耗
tgxh
2017-07-11 18:07:10 +08:00
$$('.repo > a:not(:last-child)').map(el => el.textContent)
colorwin
2017-07-12 09:56:29 +08:00
@bw2 老古董, 升不动了. 靠 Linux 强行续命. 习惯了 Ubuntu 之后, 现在有点犹豫要不要买 Mac 了. 感觉相比下 Mac 性价比好低...
xqin
2017-07-12 13:17:46 +08:00
@crs0910 你最后发的代码 ``` document.querySelector('#network').textContent.split(/\s*\/\s*react\s*/g).splice(1) ```
长度是对了, 但得到的 用户名不正确. 因为后面有一些 repo 的名字是 react-1, react-tap-event-plugin ....

而你的正则上面直接按 react 来分隔, 会导致 -1 , -tap-event-plugin 成为 后面用户名的一部分.
另外还有一个 repo 的名字是 facebook-react

所以正则需要再更新一下, 否则, 即便匹配出来了, 结果是 1000, 但得到的用户名是不正确的, 且数组的最后一个元素是空的, 也是错的.


更新后的代码如下:
network.innerText.split(/ \/ \S+\s+/g).slice(1, -1)



@ctsed 您的回复也存在同样的问题

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/374493

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX