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

6589 次点击
所在节点    JavaScript
64 条回复
hanxiV2EX
2020-07-09 19:18:05 +08:00
我也写了个,没有语法糖的。

function getMaxKeys(obj) {
var maxKeys = [];
var maxValue = null;
for (var k in obj) {
var v = obj[k];
if (maxValue === null || v >= maxValue) {
if (maxValue !== v) {
maxKeys.length = 0;
}
maxValue = v;
maxKeys.push(k);
}
}
return maxKeys;
}
hanxiV2EX
2020-07-09 19:24:12 +08:00
lovecy
2020-07-09 19:25:43 +08:00
function maxKeys(obj){
let a = [];

for (var i in obj) {
let v = obj[i];
a[v] || (a[v] = []);
a[v].push(i);
}

return a.pop();
}
大佬们轻喷(^・ω・^ )( ^・ω・^)(^・ω・^ )( ^・ω・^)
rioshikelong121
2020-07-09 20:05:33 +08:00
```javascript
function getMaxKeys(obj){
let maxValue = Math.max(...Object.values(obj));
return Object.entries(obj).reduce((total, cur) => (cur[1] === maxValue ? total.push(cur[0]) : null, total), []);
}
```

我没考虑时间复杂度。
Shy07
2020-07-09 20:43:11 +08:00
rabbbit
2020-07-09 21:34:03 +08:00
function getMaxKeys(obj) {
  let max = -Infinity;
  let maxKeys = [];
  for (const [key, value] of Object.entries(obj)) {
   if (max < value) {
    max = value;
    maxKeys = [key];
  } else if (max === value) {
    maxKeys.push(key);
  }
 }
  return maxKeys;
}
lneoi
2020-07-09 23:03:44 +08:00
Object.entries(params).reduce(
(max, [key, val]) => ((val === max[0]) ? [max[0], [...max[1], key]] : max)
, [Math.max(...Object.values(params)), []]
)[1]

来个强行一行的...
nightcatsama
2020-07-10 00:35:18 +08:00
```
const maxKeys = params => Object.keys(params).reduce((acc, cur, _, []) => !acc.length || params[cur] > params[acc[0]] ? [cur] : params[cur] === params[acc[0]] ? acc.concat([cur]) : acc)
```

写了个强行一行的,时间复杂度 On 的
autoxbc
2020-07-10 01:53:22 +08:00
@lovecy #43 稀疏数组,这个解法是别致的
ericgui
2020-07-10 05:08:52 +08:00
@rabbbit 这是正解
hejingyuan199
2020-07-10 07:33:16 +08:00
我想起了 睡觉排序
哈哈
相当优雅
Mutoo
2020-07-10 07:52:31 +08:00
函数式可以非常易读,并且容易理解。

const params = {
d: 9,
i: 15,
s: 3,
c: 15
};

const byValueDesc = i => -i[1];
const byHeadValue = (v, _, arr) => v[1] === arr[0][1];
const pickKey = i=>i[0];

_.chain(params)
.toPairs()
.sortBy(byValueDesc)
.filter(filterByHeadValue)
.map(pickKey)
.value()
Mutoo
2020-07-10 07:53:24 +08:00
@Mutoo typo: .filter(byHeadValue)
edk24
2020-07-10 09:34:15 +08:00
```
function getMaxKey(obj) {
const vals = Object.values(obj)
const max = Math.max.apply(null, vals)
const arr = Object.entries(obj)

const retkeys = []
arr.forEach(item =>{
if (item[1] == max) {
retkeys.push(item[0])
}
})
return retkeys
}

getMaxKey(params) // [ 'i', 'c' ]
getMaxKey(params2) // [ 'i' ]
```

不优雅的写法...
source
2020-07-10 10:33:54 +08:00
@autoxbc #39 完全认同
encro
2020-07-10 10:38:26 +08:00
mk= null;
for (k in params) {
if (mk===null) {
mk= k;
continue;
}
mk= params[k]>params[mk] ? k : mk;
}
return mk;
ZeroShiro
2020-07-10 10:38:41 +08:00
let max = 0;
let res = [];
for (let key in obj) {
if (obj[key] >= max) {
if (max !== obj[key]) {
res = [];
}
max = obj[key];
res.push(key);
}
}
return res;

应该可以
anson2017
2020-07-10 10:59:34 +08:00
最简单易懂的话 3 楼
最优是 43 楼吧
woodensail
2020-07-10 11:05:17 +08:00
为什么不试试神奇的 lodash 呢

_.map(_.maxBy(_.toPairs(_.groupBy(_.toPairs(params),_.last)),x=>x[0]|0)[1],_.first)
shyling
2020-07-10 11:17:41 +08:00
[Object.entries(a).sort(([a, b], [c,d]) => d - b)[0][0]]

不知道啥叫优雅。。。反正直接排序肯定容易读=-=

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

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

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

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

© 2021 V2EX