如何在浏览器中实现电子表格?

最近我在一次采访中(软件工程师)问了这个问题,并不知道如何回答这个问题。

问题集中在电子表格的algorithm以及它如何与浏览器交互。 对于处理单元及其值的最佳数据结构,我有点困惑。 我猜想任何forms的散列表都可以使用单元格作为唯一的键,值是单元格中的对象? 然后,当更新的东西,你只需要更新表中的条目。 面试官暗示了一个图表,但我不确定图表如何对电子表格有用。

我考虑的其他事情是:

  • 电子表格在浏览器中=自动保存。 在任何更新时,将所有数据发送回服务器
  • 彼此相关的细胞,即C1 = C2 + C3,C5 = C1-C4。 如果C2的值改变,则C1和C5都改变。
  • devise模式的使用? 在这种特殊的情况下,人们是否会脱颖而出?

有关如何解决这个问题的任何提示? 除了电子表格本身的algorithm之外,面试官还有什么想要的? 事实上,它在浏览器相比,单独的应用程序添加任何困难?

谢谢!

面试这是一个很好的问题。 如果这是作为你工作中的一个实际任务被问到的,那么使用第三方组件就会有一个简单的答案,这里有一些好的商业组件。

虽然我们不能确定你的面试官想要什么,但对我来说,这是一个很好的问题,因为它是如此开放的,有很多正确的答案。

您可以讨论UI以及如何实现电子表格所需的dynamic网格types以及单元格,行和列的所有function以及单元格和范围的select以及值和公式的编辑。 你可能会单独谈谈UI的含义。

或者,你可以去数据path,谈论数据结构来保存一个电子表格,精确地谈谈单元格之间的公式链接,谈论如何检测和处理循环引用,谈论如何在浏览器中,你有更less的内存控制和对于非常大的电子表格,您可能会遇到问题。 您可以谈谈JavaScript与本地语言的可用性,以及这会如何影响数据结构和计算。 此外,随着数据,电子表格的一个重要问题是数字精度和浮点数的计算。 浮点数的计算速度很快,但在精确度极高的情况下不一定准确,这就导致了很多令人困惑的问题。 我相信最近Excel切换到自己的一个固定的十进制数的表示,因为它现在是可行的到应有的电子表格级别的计算,而不使用内置的浮点计算。 您还可以讨论数据结构和计算以及它们如何影响性能。 在浏览器中,你还没有线程,所以你不能在后台运行所有的计算。 如果你有十万行计算复杂,改变一个级联的值,你可以得到一个缓慢的脚本警告。 你需要分解计算。

最后你可以运行用户体验angular度。 浏览器的体验与本机应用程序有什么不同? 在桌面应用程序中,您可以在浏览器中使用哪些优点以及哪些很酷的东西? 什么东西更复杂甚至完全不可能(例如,将电子表格应用与文件types相关联,以便用户可以双击文件并在您的在线电子表格应用中打开该文件,虽然我可能是错误的仍然不被支持) 。

好问题,很多正确答案,非常开放。

另一方面,你也可能有一个不好的面试官,专门寻找他们想要的答案,在这种情况下,你几乎不走运,除非你是心灵感应。

你可以说这太绝望了。 我可能会先从:

  • 如果大部分单元格都已填充,请使用简单的2D数组来存储它。

  • 否则使用位置到单元格的散列表

  • 或者也许像kd-tree ,这应该允许更高效的“获取显示区域中的所有内容”查询。

通过图表,你的访问者可能意味着每个单元格都是一个顶点,而对另一个单元格的每个引用都是一个有向边缘。 这将允许您相当容易地检查循环引用,并允许有效更新所有需要更改的单元格。

“在浏览器中”(大概意思是“通过networking” – 实际上“在浏览器中”本身并不意味着什么 – 可以编写一个运行在浏览器中的程序,但只能在本地运行)是非常重要的 – 需要考虑:

  • 你在本地存储什么(一切或只是当前可见的单元的子集)

  • 你如何发送更新到服务器(你发送每一个变化或保持更改的单元格的集合,只发送更新保存,或者你没有单独存储更改,只是在保存期间发送整个网格)

  • 自动保存也应该被考虑

  • 你会有一个“撤消”,这只会是本地的,如果不是,你将如何处理这在服务器上,你将如何通过更新发送

  • 只有这一个用户可以同时使用它(或者你需要满足多用户的需求,这会带来处理冲突的问题)

  1. 查看CSS游标属性只是为了创build电子表格Web应用程序。
  2. HTML表格还是CSS网格? HTML表格是专门为表格数据而构build的。
  3. 调整单元格的高度和宽度可以通过offsetX和offsetY来实现。
  4. 存储数据是微不足道的。 它可以是Mongo,mySQL,Firebase等等。 在模糊,发送更新。
  5. Javascrip / ECMA不仅能够提供所有的Excel内置function。 我提到networking工作者吗?
  6. 需要像列ID一样增加字母? 我覆盖了你 。
  7. 最重要的是,不要这样做 。 为什么? 因为它已经完成了 。 find一个需求,并开展这个项目。