js 写后台, 是不是有点先天残缺?

2022-07-28 11:21:39 +08:00
 bthulu

最近在做一个面向企业内部生产运输的系统, 生产排程及排车排程算法异常复杂, js 原生容器字典非常简陋, 也缺乏对容器字典进行各种排序过滤反查的手段.
像 java 原生就支持多种集合字典, 不行还有 guava 来凑.
C#的 Linq 就更不用说了.
这几天 js 写的越多就越怀疑人生, 数据处理稍微复杂一点的啥都要自己写工具函数来干, 是不是我水平太菜了, 实际 js 是有简单现成的进行复杂的数据处理的办法的?

8840 次点击
所在节点    JavaScript
79 条回复
libook
2022-07-28 12:46:57 +08:00
@adoal #20 是指 String.prototype.padStart()嘛?
dcsuibian
2022-07-28 12:50:56 +08:00
@bthulu 你说的这些 js 基础库确实没有啥支持的,正常一下子也用不到那么多。
不过基本的排序过滤反查其实都是有的,稍微多一点代码也都能实现。

js 中基础的数据结构是不缺的,数组其实就是变长数组,也支持 push()、pop()、shift(),基本就是有队列、栈的功能。
ES6 有 Set 、Map ,而且支持按插入顺序遍历,甚至对象本身其实也能做一个 Map 。
xingjue
2022-07-28 12:58:25 +08:00
go 不香吗
Rache1
2022-07-28 13:02:52 +08:00
@libook 这个出现的也有些晚了,在 ES 2017 里面出现的(常说的 ES 6 指 ES 2015 ),当然,现在大部分情况下都是可用的了 😆
adoal
2022-07-28 13:09:09 +08:00
@libook 历史上著名的 azer left-pad 包血案……事后还有人做了一个段子包 is-thirteen 来调侃 JS 圈封包太小太细的现状
xg4
2022-07-28 13:18:58 +08:00
去重 _.uniq, _.unionBy
排序 _.sortBy, _.orderBy
分组 _.groupBy

https://lodash.com/docs/4.17.15
xg4
2022-07-28 13:24:32 +08:00
uniqBy
Mexion
2022-07-28 13:45:45 +08:00
@xingjue 你仿佛在搞笑,go 也配和 js 比,还是在数据操作方面,就 go 这种啥都没有的语言,都不够给其他语言提鞋,垃圾中的垃圾
zhuangzhuang1988
2022-07-28 13:54:58 +08:00
@bthulu 很多前端不知道这些的,java C#里标准容器很多宝库的 js 是没有的
dcsuibian
2022-07-28 13:54:59 +08:00
我 js 和 Java 都写,C#不写。个人也觉得 js 写后台不好,但也没那么差,主要是要:扬长避短。

js 写起来比较舒服的点:
1 、函数式支持。数组可以直接使用 map 、reduce 、filter ,Java 这边就得先弄成 Stream 搞流式编程。
2 、如果要创建一个对象,不必特定搞一个类。直接双花括号就可以。
3 、语法糖。js 的语法糖很多,比如正则表达式、模板字符串、解构赋值等,处理 JSON 更是极其方便。
4 、没有 Java 那个检查型异常,写起来方便很多。
5 、异步支持。js 有 promise 、async/await 。由于自身单线程的特性,对异步的支持非常好。

但缺点:
1 、不严谨。js 本身有很多设计缺陷,比如 falsy 、undefined 还有各种离谱的隐式转换等等,不熟悉的话容易踩坑,考验你和同事的水平。
2 、性能,js 主要考虑功能,很少考虑实现。比如 ES6 的 Set 就是直接 const set=new Set()。数组当队列也是,能用就行。
3 、单线程事件循环模型,比如你的阻塞队列就是没有的。
能拿来写后台的一个很大原因是不少后台都是 IO 密集型而非计算密集型。而 JS 是把网络 IO 交给底层去管,所以轻松。要是计算密集型估计就蛋疼了。
4 、工具差。官方模块化基本是 ES6 的事了,导致要考虑 CommonJS 、ES Module 、AMD 啥的。npm 设计也是稀烂,包管理器都能吵起来。
5 、生态差,缺乏最佳实践。隔壁 Spring 开发 web 后台,大体都给你定好了,直接用就行。

另外非常赞同#1 的观点,不要用 Java 的思想写 JS ,比如:
1 、Java 有类。比如 toString()、hashCode()、equals()方法你可以直接改类。但 JS 如果你用花括号定义的对象其实是直接来自 Object 的,个人觉得改 Object.prototype 应该不是个好主意。
2 、Java 有类,有注解,有反射机制。比如 JPA ORM 就靠反射获取信息,但 JS 的肯定就不是这么做了。
3 、 @Transactional 注解。既有注解,又是线程相关的模型。
4 、Java 强制你用面向对象的语法写,但 js 没有。
libook
2022-07-28 14:10:06 +08:00
看了题主的附言,也能够理解题主的困惑,JS 目前不包含很多现成的复杂数据结构,但是繁荣的技术栈生态使得总能够找到第三方的实现,而且可以找到多家实现进行 PK ,如果一种实现被大多开发者接受,那么也有可能以草案的形式逐渐成为 JS/ES 标准的一部分,算是某种市场化发展理念吧。

所以客观来说,题主附言里的大多东西 JS 标准 API 里是没有的,大量涉及这些数据结构和算法的场景就需要第三方库或自建库来实现了。

我做过 7 年的 JS 后端开发,但确实日常业务中涉及队列的情况比较少,要么就是分布式微服务架构下使用 Redis 、RabbitMQ 之类的消息队列中间件,要么就是自己简单手写个队列(比如流控、时序和削峰填谷),所以暂时也无法推荐什么好用的库,我只说一些自己实现的思路吧。

单纯的先进先出的话,Array 有现成的 push 、pop 、shift 、unshift 等方法可以用,取决于你是想按索引正序还是倒序排队。
有界无界这个没有原生 API ,如果需要的话我通常是把 Array 封装成一个对象,然后在 add 的时候自己加个数量判断。
JS 使用 promise 及其语法糖控制异步过程,阻塞可以在 add 或 remove 的时候判断队列状态,需要阻塞就暂时不 resolve promise 。
去重可以内置 Set 或 Map ,也可以在封装的 add 方法中自己定义复杂重复判定过程。
有序集合可以用 Map 或 Object ,无序集合可以用 Array 、Set 。
双向字典和多 Key 字典可以用多个个 Map 或 Object 封装一下。
getOrAdd 可以在 Map 、Object 、Set 基础上封装。
分组和排序可以用 lodash 之类的工具库,sort 很多时候手写个 callback 也挺方便的。

如果频繁使用这些数据结构的话,可以自己写个 library ,然后在各个项目中引用。
IvanLi127
2022-07-28 14:13:01 +08:00
JS 的内置库确实没 JAVA 和 C# 丰富,不过解释型的语言倒不拘泥这块,用是没问题的,正常开发也感受不到相比其他语言有什么明显缺陷。复杂的数据处理之类的,应该去引用第三方的库,一般都有很成熟、热门且好用的开源库给你选。
数据集合操作我推荐引用 ramba.js ,FP 爽呀
另外,JS 和 JAVA 、C# 思想还是有些不同,有些东西不能类比
guanhui07
2022-07-28 14:18:16 +08:00
https://github.com/ecrmnn/collect.js 这个 collect.js 觉得 挺好用的
ipwx
2022-07-28 14:18:25 +08:00
说得好,我选择前端用 js ,后端用其他语言。
ChevalierLxc
2022-07-28 14:44:03 +08:00
总感觉题主是没有人带着做 JS 项目,自己撸出的问题。。
fanyer
2022-07-28 14:59:49 +08:00
@adoal
@libook

说的 2016 年 leftpad 删库事件吧,多少年前的老黄历了
byzf
2022-07-28 15:11:48 +08:00
错误的提问方式:
求推荐 javascript 处理集合的基础库。
回复:2 收藏:16

正确的提问方式:
js 先天残缺,没有处理集合基础库。
回复:100+ 收藏:0
ScepterZ
2022-07-28 15:14:22 +08:00
go 也很缺这些,个人觉得对开发效率和 bug 率都挺有影响的
zhuangzhuang1988
2022-07-28 15:14:54 +08:00
@dcsuibian @libook 然而评论里很多 提到 lodash ramda 库, 这些人估计没搞过数据结构
题主提到的 js 缺少的数据结构 这 2 个库都搞不定。
hahasong
2022-07-28 15:16:01 +08:00
lodash 了解一下,js 基础库是简漏了点,但奈不住包多 屁大个方法都有对应的包

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

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

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

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

© 2021 V2EX