bfe.dev 是一个针对前端的刷题网站,像是前端的LeetCode。该系列文章是我在下面的刷题日记。

题目 88

BFE.dev#88 在JavaScript中实现负索引

剖析

首先看一下example

第一直觉是能够间接返回一个固定的object, 比方这样{0:1, 1:2, 2:3, -1:3, -2:2, -3:1}。然而这样搞数据是死的,上面的题目要求很难实现。

咱们能够用getter/setter来实现和原来数组的数据同步,比方这样:

然而除了-1,还有-2, -3, ...-originalArr.length. 当数组length变动的时候得同步更新这些property。不是不可能,然而比拟苦楚

救世主 Proxy

从题目的example能够看出,咱们须要的实际上是一个“代理”一样的货色

  1. 所有数据的存取都是在原来的数组进行
  2. 只是在index是正数的时候,咱们略微改变一下存取的对象

首先咱们写一个最根本proxy:

这个Proxy齐全proxy到原数组,啥也不做。所以测试用例中的non-negative index的局部实际上还能通过。

解决负索引

get 中的prop不是number,咱们parse一下,而后转换为正确的index就ok了

not iterable!

啊, [...arr] 测试没通过。

[...arr] 实际上调用的是指标的Symbol.Iterator办法,因为咱们的proxy不领有数组,咱们须要把这个调用代理到原数组上。这时候能够用 Function.prototype.bind()达到目标。

通过!撒花!

这在BFE.dev是个很有意思的题目,心愿能帮忙到你。下次见。