js 大佬请赐教优雅算法

2020-07-09 11:25:44 +08:00
 coderQiQin
let params = {
    d:9,
    i:15,
    s:3,
    c:15
  }
  // ['i','c']
  
let params2 = {
    d:9,
    i:20,
    s:3,
    c:10
  }
  // ['i']

期望返回最大值的 key 的数组, 有没有优雅方式,或者函数式

6564 次点击
所在节点    JavaScript
64 条回复
ericgui
2020-07-09 14:29:42 +08:00
怎么写,时间复杂度都是 O(n)
优雅不起来
Tdy95
2020-07-09 14:40:29 +08:00
7 楼+1,我猜楼主的意思是想代码看起来漂亮、短小点?
renmu123
2020-07-09 14:42:56 +08:00
我觉得 for 循环最优雅间接,一眼就能看得出来在干啥
wanguorui123
2020-07-09 14:45:03 +08:00
Object.entries(params).filter(item=>item[1] === Math.max(...Object.values(params))).flatMap(item=>item[0])
aaronlam
2020-07-09 15:18:59 +08:00
写法上的优雅应该还是 7 楼的比较优雅把
wanguorui123
2020-07-09 15:19:12 +08:00
var maxKeys = params => Object.entries(params).filter(item=>item[1] === Math.max(...Object.values(params))).flatMap(item=>item[0])
source
2020-07-09 15:46:43 +08:00
为啥都在说 7 楼最优。。。
reduce 的回调自由度太大了,很难一眼看出编写者的意图
我第一反应是跟 4 楼一样(除了我是 const 拥护者以外
source
2020-07-09 15:47:27 +08:00
看花了,是 3 楼
otakustay
2020-07-09 15:48:39 +08:00
@source 我同意你的说法,事实上最易读的是写个 for,想要 const 可以来个 const max = {current: 0} 玩
写 reduce 纯粹吧……一种信仰
tiedan
2020-07-09 15:53:07 +08:00
易读算优雅还是代码短算优雅 这是个问题
roscoecheung1993
2020-07-09 15:56:13 +08:00
可读就 3 楼,追求效率就 for 遍历一趟
takemeaway
2020-07-09 16:03:11 +08:00
for 循环多简洁明了,整那么多花里胡哨的。
jackielin
2020-07-09 16:12:57 +08:00
如果用 ramdajs 的话
`R.reduce(R.max, -Infinity, Object.values(params))`

可以解决
alonehat
2020-07-09 16:15:04 +08:00
Object.entries(params).sort(function(a,b){return b[1]-a[1]}).filter(function(item,index,arr){ return item[1]==arr[0][1] }).join('').match(/[a-z]/g)

手动滑稽
chen90902
2020-07-09 17:52:05 +08:00
也来试一下

```js

const maxKeys = (obj) =>
Object.keys(obj).filter(
(key, _, arr) =>
obj[key] ===
Math.max.apply(
Math,
arr.map((key) => obj[key])
)
);

```
brucewar
2020-07-09 17:54:41 +08:00
再简洁的代码,也要保证别人或者自己回头看的时候容易理解
gdrk
2020-07-09 18:34:28 +08:00
同意三楼,简洁可读性强。
assassin1993zj
2020-07-09 18:50:57 +08:00
@misdake 写的好啊
autoxbc
2020-07-09 18:54:10 +08:00
for 不够函数式
reduce 心智负担大

写多了就知道,这两个能不用就不用
hanxiV2EX
2020-07-09 19:07:13 +08:00
写 for 吧, 不华丽花哨,看代码的人能一眼看出来就行。

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

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

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

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

© 2021 V2EX