diff --git a/README.md b/README.md index 5416359..c8df6e1 100644 --- a/README.md +++ b/README.md @@ -24,212 +24,15 @@ 成功采纳后,如果你面试遇到其他问题,笔者可以提供免费解答服务。 +[线上网站查看过往原题](https://jsgodroad.com/questions) + ### 今日原题 -第九题:[修改嵌套层级很深对象的 key](https://github.com/KieSun/fucking-frontend/issues/14) +[第十三题:有没有做过什么困难的项目?](https://github.com/KieSun/fucking-frontend/issues/18): -```js -const a = { - a_y: { - a_z: { - y_x: 6 - }, - b_c: 1 - } -} -// { -// ay: { -// az: { -// yx: 6 -// }, -// bc: 1 -// } -// } -``` +今天来做一道其实算是很常见的泛技术问题:有没有做过什么困难的项目? -第八题:[对一个很长的名字数组,做分片更新名字请求](https://github.com/KieSun/fucking-frontend/issues/13) - -```js -/* - * 对一个很长的名字数组,做分片更新名字请求: - * 1. 分片里的更新是并行的,执行 changeName - * 2. 各个分片间是串行的,执行 sleep - * 这个函数接受三个参数,名字列表、分片数量,每次分片后的等待时间 - * 比如: - * slicePostTask(['aa', 'bb', 'cc', 'dd', 'ee', 'ff', 'gg', 'hh'], 2, 2000) - * // => ['aa', 'bb'] - * waiting 2s - * // => ['cc', 'dd'] - * waiting 2s - * // => ['ee', 'ff'] - * waiting 2s - * // => ['gg', 'hh'] - */ - -const changeName = (name) => new Promise((resolve, reject) => { - setTimeout(() => resolve(name), 1000) -}) - -const sleep = time => new Promise((resolve, reject) => { - setTimeout(resolve, time) -}) - -const slicePostTask = async (names, chunkSize, time) => { - // todo -} -``` - -第七题:[数据排重](https://github.com/KieSun/fucking-frontend/issues/11) - -
- -```js -const dedup = (data, getKey = () => {} ) => { - // todo -} -let data = [ - { id: 1, v: 1 }, - { id: 2, v: 2 }, - { id: 1, v: 2 }, -]; - -// 以 id 作为排重 key,执行函数得到结果 -// data = [ -// { id: 1, v: 1 }, -// { id: 2, v: 2 }, -// ]; - -let data1 = [ - { id: 1, v: 1, id1: 1 }, - { id: 2, v: 2, id1: 2 }, - { id: 1, v: 2, id1: 1 }, -] - -// 以 id 和 id1 作为排重 key,执行函数得到结果 -// data1 = [ -// { id: 1, v: 1, id1: 1 }, -// { id: 2, v: 2, id1: 2 }, -// ]; -``` - -
- -第六题:[实现一个 chunk 函数](https://github.com/KieSun/fucking-frontend/issues/8) - -
- -```js -/** - * @param input - * @param size - * @returns {Array} - */ -_.chunk(['a', 'b', 'c', 'd'], 2) -// => [['a', 'b'], ['c', 'd']] - -_.chunk(['a', 'b', 'c', 'd'], 3) -// => [['a', 'b', 'c'], ['d']] - -_.chunk(['a', 'b', 'c', 'd'], 5) -// => [['a', 'b', 'c', 'd']] - -_.chunk(['a', 'b', 'c', 'd'], 0) -// => [] -``` - -
- -第五题:[Promise.all 错误处理](https://github.com/KieSun/fucking-frontend/issues/6) - -
- -异步请求通过 Promise.all 处理,怎么让其中失败的所有请求重试。 - -```js -Promise.all([A, B, C, D]) -// 4 个请求完成后发现 AD 请求失败了,如果让 AD 请求重试 -``` - -[答案](./Answer/1%20~%2010/5.md) - -
- -第四题:[消息队列](https://github.com/KieSun/fucking-frontend/issues/5) - -
- -页面上有三个按钮,分别为 A、B、C,点击各个按钮都会发送异步请求且互不影响,每次请求回来的数据都为按钮的名字。 - -请实现当用户依次点击 A、B、C、A、C、B 的时候,最终获取的数据为 ABCACB。 - -[答案](./Answer/1%20~%2010/4.md) - -
- -第三题:[请按照用例实现代码](https://github.com/KieSun/fucking-frontend/issues/3) - -
- -```js -// 请使用原生代码实现一个Events模块,可以实现自定义事件的订阅、触发、移除功能 -const fn1 = (... args)=>console.log('I want sleep1', ... args) -const fn2 = (... args)=>console.log('I want sleep2', ... args) -const event = new Events(); -event.on('sleep', fn1, 1, 2, 3); -event.on('sleep', fn2, 1, 2, 3); -event.fire('sleep', 4, 5, 6); -// I want sleep1 1 2 3 4 5 6 -// I want sleep2 1 2 3 4 5 6 -event.off('sleep', fn1); -event.once('sleep', () => console.log('I want sleep')); -event.fire('sleep'); -// I want sleep2 1 2 3 -// I want sleep -event.fire('sleep'); -// I want sleep2 1 2 3 -``` - -[答案](./Answer/1%20~%2010/3.md) - -
- -第二题:[以下代码输出什么,为什么?](https://github.com/KieSun/fucking-frontend/issues/2),这道题目是第一题的进阶版本,更有趣了。 - -
- -```js -try { - let a = 0 - ;(async function() { - a += 1 - console.log('inner', a) - throw new Error('123') - // a() - })() - console.log('outer', a) -} catch(e) { - console.warn('Error', e) -} -``` -[答案](./Answer/1%20~%2010/2.md) - -
- -第一题:[以下代码输出什么,为什么?](https://github.com/KieSun/fucking-frontend/issues/1) - -
- -```js -try { - (async function() { a().b().c() })() -} catch (e) { - console.log(`执行出错:${e.message}`) -} -``` - -[答案](./Answer/1%20~%2010/1.md) - -
+对于这个问题大家会如何作答? ## 前端十五万字面试资料