js 大佬请赐教优雅算法
let params = { d:9, i:15, s:3, c:15 } // ['i','c'] let params2 = { d:9, i:20, s:3, c:10 } // ['i']
期望返回最大值的 key 的数组, 有没有优雅方式,或者函数式
let params = { d:9, i:15, s:3, c:15 } // ['i','c'] let params2 = { d:9, i:20, s:3, c:10 } // ['i']
期望返回最大值的 key 的数组, 有没有优雅方式,或者函数式
if (value === acc.max) {
acc.list.push(key);
}
return acc;
}, {max: 0, list: []}).list;
maxKeys(params); // [“i”, “c”]
“`
function getMaxKeys (obj) {
return _.keys(obj).filter(key => obj[key] === _.max(_.values(obj)));
}
result = getMaxKeys(params)
if (value === max) {
return [value, keys.concat(key)];
}
return [max, keys];
},
[-Infinity, []]
)
_.chain(params).toPairs().sortBy(i => -i[1]).filter((v, _, arr) => v[1] === arr[0][1]).map(i => i[0]).value()
貌似还有点不优雅。。。
可以解决
手动滑稽
“`js
const maxKeys = (obj) =>
Object.keys(obj).filter(
(key, _, arr) =>
obj[key] ===
Math.max.apply(
Math,
arr.map((key) => obj[key])
)
);
“`
写多了就知道,这两个能不用就不用
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;
}
for (var i in obj) {
let v = obj[i];
a[v] || (a[v] = []);
a[v].push(i);
}
return a.pop();
}
大佬们轻喷(^・ω・^ )( ^・ω・^)(^・ω・^ )( ^・ω・^)
我没考虑时间复杂度。
来个强行一行的…
写了个强行一行的,时间复杂度 On 的
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()
const retkeys = []
arr.forEach(item =>{
if (item[1] == max) {
retkeys.push(item[0])
}
})
return retkeys
}
getMaxKey(params) // [ ‘i’, ‘c’ ]
getMaxKey(params2) // [ ‘i’ ]
“`
不优雅的写法…
应该可以
_.map(_.maxBy(_.toPairs(_.groupBy(_.toPairs(params),_.last)),x=>x[0]|0)[1],_.first)
不知道啥叫优雅。。。反正直接排序肯定容易读=-=