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 的数组, 有没有优雅方式,或者函数式

6291 次点击
所在节点    JavaScript
64 条回复
hackyuan
2020-07-09 11:51:25 +08:00
写了个不优雅的
```js
const maxKeys = obj => Object.entries(obj).reduce((acc, cur) => {
const [key, value] = cur;
if (value > acc.max) {
acc.max = value;
acc.list = [key];
return acc;
}

if (value === acc.max) {
acc.list.push(key);
}

return acc;
}, {max: 0, list: []}).list;

maxKeys(params); // ["i", "c"]
```
fe619742721
2020-07-09 11:59:28 +08:00
遍历一次就可以了吧
misdake
2020-07-09 12:00:04 +08:00
let max = Math.max(...Object.values(params));
Object.keys(params).filter(key => params[key] === max) // ["i", "c"]
aguesuka
2020-07-09 12:21:21 +08:00
建议用循环,显然需要一个 variable 当前保存最大值,和一个 mutabl list 保存 key 。不过改成递归应该比较漂亮。
Hanggi
2020-07-09 12:21:39 +08:00
import _ from 'lodash'

function getMaxKeys (obj) {
return _.keys(obj).filter(key => obj[key] === _.max(_.values(obj)));
}

result = getMaxKeys(params)
cigmax
2020-07-09 12:24:08 +08:00
const maxKeys = Object.entries(params).reduce((acc,cur)=>{if(cur[1]>acc[1]){return [[cur[0]],cur[1]]} else if(cur[1]===acc[1]){return [[...acc[0],cur[0]],cur[1]]}},[[],0])
otakustay
2020-07-09 12:30:08 +08:00
const maxKeys = Object.entries(array).reduce(
([max, keys], [key, value]) => {
if (value > max) {
return [value, [key]];
}

if (value === max) {
return [value, keys.concat(key)];
}

return [max, keys];
},
[-Infinity, []]
)
Mutoo
2020-07-09 12:32:39 +08:00
import _ from 'lodash';

_.chain(params).toPairs().sortBy(i => -i[1]).filter((v, _, arr) => v[1] === arr[0][1]).map(i => i[0]).value()
musi
2020-07-09 12:37:42 +08:00
```
let getMaxKeys = obj => Object.keys(obj).map(key => obj[key] == Math.max.apply(null, Object.values(obj)) ? key : null).filter(k => k != null)
```

貌似还有点不优雅。。。
musi
2020-07-09 12:41:49 +08:00
@musi 把 map 直接改为 filter 就比较优雅了。
```
let getMaxKeys = obj => Object.keys(obj).filter(key => obj[key] === Math.max.apply(null, Object.values(obj)))
```
xrr2016
2020-07-09 12:52:58 +08:00
Object.values(params).sort((a, b) => b - a)[0]
Cbdy
2020-07-09 12:58:48 +08:00
function getMaxValueKeys(params) {
const invertedMap = Object.entries(params).reduce((a, c) => (a.set(c[1], [...(a.get(c[1]) || []), c[0]])), new Map)
const maxKey = Math.max(...invertedMap.keys())
return invertedMap.get(maxKey)
}
dartabe
2020-07-09 13:03:08 +08:00
顶一发 filter 感觉函数式有点语义化 瞎用的话没问题 但是不优雅
dartabe
2020-07-09 13:06:38 +08:00
从算法角度 我还是觉得直接 for 吧
yamedie
2020-07-09 13:11:20 +08:00
盲猜 7 楼最优, 更优估计就是原生 for 了
klesh
2020-07-09 13:21:15 +08:00
Object.keys(params).reduce((k, r) => params[k] > r ? params[k] : r, Number.MIN_VALUE)
no1xsyzy
2020-07-09 13:49:46 +08:00
#7 的 keys.concat(key) 可以改成 [...keys, key]
Hanggi
2020-07-09 14:11:44 +08:00
没看懂你们对优雅的定义。。。
KuroNekoFan
2020-07-09 14:11:48 +08:00
你问的应该叫写法不叫算法
hupo0
2020-07-09 14:16:10 +08:00
const maxKey = function (o) {
const [r] = Object.entries(o).reduce(([r, max], [k, v]) => {
switch (Math.sign(v - max)) {
case -1:
return [r, max];
case 0:
return r.push(k), [r, max];
case 1:
return [[k], v];
}
});
return r;
};

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

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

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

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

© 2021 V2EX