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

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

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

8403 次点击
所在节点    JavaScript
79 条回复
libook
2022-07-28 11:39:41 +08:00
对 Java 不大了解,可以详细讲一下“容器字典”、“集合字典”是什么概念嘛?

处理一组数据的话,通常 JS 里可以使用 Array 、Map 、Set ,特殊需求下可以自己构造数据结构和自建迭代器。

建议不要用一种技术栈的思维硬套在另一种技术栈上,比如你完全用 Java 的思想来写 C#也一定很难受,既然要用 JS 就最好按照 JS 的思维来设计程序。

所以可以把具体问题发出来,V 站里不缺精通 JS 的人,大家可以帮你看看究竟是 JS 不合适这种需求还是有你不了解的更好的方案。
nowheremanx
2022-07-28 11:41:39 +08:00
写过一些 JS ,我都是手写,但是专业写 JS 的都会用 lodash 类似的库

https://lodash.com/
AaronWang13
2022-07-28 11:49:05 +08:00
js 作为编程语言来说本身就是有残缺的,因为他原来就是个脚本语言,运行环境也仅仅是在浏览器环境。
AoEiuV020CN
2022-07-28 11:50:35 +08:00
我感觉 javascript 处理数据最糟糕的是处理二进制数据,
关键不同的第三方库都是分别封装自己专用的字节数组,
有些情况实在没办法甚至只能序列化再反序列化来传递参数,

不过我不是专业 js 的,不怎么确定,
TWorldIsNButThis
2022-07-28 11:50:53 +08:00
js 标准库是残废的 要自己引数据结构的包
AaronWang13
2022-07-28 11:52:58 +08:00
但是 js 生态繁荣啊,这么多年修修修补补,写后台逻辑还是够的,建议你多去看看社区现有的轮子,比自己硬干好。
bthulu
2022-07-28 11:58:38 +08:00
@libook 比如有界 /无界队列, 阻塞 /非阻塞队列, 有序集合, 按对象指定属性判重的集合, 双向字典, 多 key 字典, 字典集合原生支持 getOrAdd(或 Compute)之类的操作, 字典按某个字段分组(类似 SQL 里的 group by), 集合依次按对象多个属性进行排序,...
bthulu
2022-07-28 11:59:28 +08:00
@AaronWang13 能伸手问下, 有哪些现成的轮子吗
libook
2022-07-28 12:00:49 +08:00
JS/ES 是个一直在快速迭代发展的语言,到现在依然每个月都有新的草案被提出或正式被引擎支持,其实已经有相当多的新特性可以给开发提供各种便利了,只不过很多人不知道罢了。

如果对 JS 的印象还停留在在几年之前,已然今非昔比。
ljpCN
2022-07-28 12:03:09 +08:00
@bthulu #8 楼上已经有朋友说了 lodash ,另外推荐一个 ramda 。你在 7 楼提到的 groupBy 这种操作这些工具库是有的。队列与栈在 JS 里都是数组的原生操作就支持,不过要实现你说的有界 /无界种种限制,可能要借助第三方库,善用 npm 即可。
mxT52CRuqR6o5
2022-07-28 12:03:29 +08:00
@bthulu npmjs.org github.com 直接搜你要的东西
Pythoner666666
2022-07-28 12:12:01 +08:00
看了楼上的回答,nodejs 在国内不火倒是有原因的。
Pythoner666666
2022-07-28 12:13:32 +08:00
@libook 确实如此,我在知乎上提到 nodejs 的语言的一些优势,一堆人来喷我。。。他们摆出的一些观念和语言特性,基本上还停留在 0.X 的版本
molvqingtai
2022-07-28 12:16:44 +08:00
如果还是使用的的 ES5 的话,那么处理数据确实比较麻烦,建议使用 ES2020+

比如分组,自带的就有 Array.prototype.group() (可能需要 polyfill ),还有 Map Set 这些完全够用了
再不够,直接用 lodash
duke807
2022-07-28 12:17:08 +08:00
沒錯,後台還是用 python 更方便
codehz
2022-07-28 12:20:19 +08:00
js 的最大缺陷大概就是没有(支持直接共享内存的)原生线程吧,worker 的线程其实也可以用一些同步原语(包括原子操作和锁定语义),SharedArrayBuffer 也不是没有——但是只能操作二进制数据,不能直接用来传递对象——因而进行相关封装的就比较少(所谓阻塞队列,基本也是在多线程语境下才有意义吧),这也是为什么明明 wasm 性能不一定比 js 好,但是仍然有很多用到多线程处理的库采用 wasm 进行(
不过对于简单的多线程处理,采用 postMessage 的方法也不是完全不能接受,太重的计算就不太适合了
thinkershare
2022-07-28 12:27:28 +08:00
你说的这些和 ES 这门语言没啥关系. ES 的标准库太弱了, 前端看上去如此繁荣的主要原因就是因为标准库太弱, 而 JS 要做的事情又越来越多, 因此大家不停的造出来各种轮子, 然后有了 npm 这种辣鸡, 然后不停的玩废掉一个个框架, 再来创建一个新的. 核心原因就是标准库太弱了, 随便实现点什么功能都要引用一大堆第三方 library, 而且很多 Library 就几行代码, 你根本不知道整个 npm 按照的依赖都是些什么鬼东西.
mxT52CRuqR6o5
2022-07-28 12:31:08 +08:00
js 毕竟客户端语言,不应该设计出很重的标准库,用 js 就要习惯于去找社区实现的轮子
blindie
2022-07-28 12:34:31 +08:00
有界 /无界:数据流 Stream 吗?用的不太多,其他人可以补充。
阻塞 /非阻塞:Promise | async await
去重 /不去重队列:去重可用 Set ,不去重 Array Map 都可
有序集合:Array Map 自带顺序
按对象指定属性或函数判重的集合:ArrayLike.filter()
双向字典:用两个 set
多 key 字典:add, search 用 set 就可以,delete 可以用双向字典实现 (这个可能稍微复杂一点)
字典集合原生支持 getOrAdd(或 Compute)之类的操作:Array.map()
字典按某个字段分组(类似 SQL 里的 group by):仅查询时候用 ArrayLike.filter() 就可以。如果要优化查询速度直接 Set 包 Array 就可以 new Set<ArrayLike>。
集合依次按对象多个属性进行排序:Array.sort()

你的这些基本上都可以用 ES6 的数据结构加上他们的方法快速实现掉,甚至都没有用上 lodash 。如果是语法角度的话,JS (ES6) TS 是非常 ducktyping 的,不需要先定义是什么数据结构而是通过函数链式组合来实现功能。
adoal
2022-07-28 12:38:39 +08:00
JS 圈连 left padding 这种一句话的事都要专门写一个包。据说凡是能用 JS 重写的都会用 JS 重写(另一个有此殊荣的语言是 Rust )。你想做的事,社区都有包,只是包的质量不一定靠谱罢了。

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

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

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

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

© 2021 V2EX