昨天面试,今天发现面试官 2 个问题都弄错了

2018-05-31 22:35:11 +08:00
 lazyzml

首先第一个问题是\w 匹配什么,我说的匹配小写 a-z,然后他说不对,是匹配空格,tab 符那些。

然后第二个问题是 js 如何数组去重

我回答第一个方法是 new Set(arr)去重,第二个方法是通过递归然后比较。我主要考虑到了对象。 面试官大意是何必用递归那么复杂的,直接再建一个数组,然后 indexOf 判断。我当时想,哎,没想到用 indexOf 判断,现在想来,indexOf 并不能比较对象,面试官说错了。

6808 次点击
所在节点    JavaScript
38 条回复
lazyzml
2018-06-01 00:35:03 +08:00
@rabbbit 我猜因为 indexOf 内部循环了一遍
fulvaz
2018-06-01 00:37:29 +08:00
@lazyzml 因为两个对象内存地址不一样的, 你又没说两个内容相同的视为同样对象.

即使是加上了这个要求还是能搞, 缺陷是, 如果对象内有函数就不行了, 而且存在循环引用也不行

````
arr.reduce((p, n) => {
if (typeof n === 'object') {

}

return p.indexOf(n) === -1 ? [...p, n] : p;
}, [])
````
fulvaz
2018-06-01 00:44:44 +08:00
手滑手滑

````
arr.reduce((p, n) => {
if (typeof n === 'object') {
n = JSON.stringify(n);
}
return p.indexOf(n) === -1 ? [...p, n] : p;
}, []).map((e) => {
const parsed = JSON.parse(e);
if (typeof parsed === 'object') {
return parsed;
} else {
return parsed;
}
})
````

"undefined 的情况我想到了但是我不写了, 我只是来面试的, 没心情写业务."

不过现在复杂度是几我已经不知道了, 反正爆炸 [手动捂脸]
fulvaz
2018-06-01 00:46:19 +08:00
深夜无聊加点科普.

不需要函数的简单对象, 深克隆最简单的方法是 JSON.stringify, 楼主递归估计是考虑到要递归对象对比值吧.
lazyzml
2018-06-01 00:50:03 +08:00
@fulvaz 是啊。。。我现在正在尝试能不能比较互相引用了的对象。
fulvaz
2018-06-01 00:55:14 +08:00
@rabbbit 大概是对这个对象进行先序遍历, 但是需要多一个 O(n)的数组存已经遍历过的节点, 如果某节点已经存在于数组中, 则跳过这个节点, 继续访问下一个节点

唔, 大概每个遍历出来的结果都是唯一的吧. 然后再做比较

不过.....我写这段代码之前应该会先去找产品聊聊人生啥的.

或者.....自己陷入怀疑人生, TM 这是什么业务.
fulvaz
2018-06-01 00:56:53 +08:00
@lazyzml 你可别试了, 上次我遇到这种循环引用的时候, 我直接换了种实现方法

解法去找司徒正美的博客.

好是好, 但是没法适应业务, 惨
lazyzml
2018-06-01 01:02:32 +08:00
@fulvaz 那我不试了。。。睡了,拜拜。
wd
2018-06-01 08:08:06 +08:00
indexOf 去重的公司就别去了…
CasualYours
2018-06-01 08:56:18 +08:00
对象比较通过 json 转字符串不知道可不可行
zarte
2018-06-01 09:36:21 +08:00
@wd 那用啥去重?
msg7086
2018-06-01 10:04:36 +08:00
没记错的话正确的去重做法是利用哈希表,JS 没有哈希表就扔在 Object 上咯。
有 Set 的话用 Set 也是可以的。
cuzfinal
2018-06-01 10:13:20 +08:00
旗鼓相当的对手
Linxing
2018-06-01 10:26:15 +08:00
难道去重不是用 SET ???
enenaaa
2018-06-01 11:19:38 +08:00
感觉递归和 indexOf 是差不多的消耗时间。因为内置函数的缘故,可能 indexOf 还快一点。
doublelam
2018-06-01 12:28:32 +08:00
@CasualYours 如果有 key 值含有 undefined 或者 function 就不行
KuroNekoFan
2018-06-01 15:01:32 +08:00
感觉首先要定义怎么算'重',当然,一般都只考虑基本类型
njwangchuan
2018-06-09 15:51:31 +08:00
@lazyzml 我来帮面试官补充下他的思路:

arr.filter((item,index) => arr.indexOf(item) == index);

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

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

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

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

© 2021 V2EX