Javascript 对象中的最高值(如果最大值更多且相同,则更多)
假设我有这样的对象:Javascript 对象中的最高值(如果最大值更多且相同,则更多),javascript,max,Javascript,Max,假设我有这样的对象: var obj = {a : 5, b : 10, c : 15, d : 20, e : 20, f : 25}; 我希望得到前3个最高值-注意,d和e键具有相同的值,我还需要得到键,因此它看起来像: 最高值: f-25 d-20 e-20 此外,如果有六个值,四个值相同: var obj2 = {a:1, b:1, c:1, d:1, e:0,8, f: 0,5}; 我需要展示4个最高的 最高值: a-1 b-1 c-1 d-1 我想需要迭代所有对象属性才能得到Ma
var obj = {a : 5, b : 10, c : 15, d : 20, e : 20, f : 25};
我希望得到前3个最高值-注意,d和e键具有相同的值,我还需要得到键,因此它看起来像:
最高值:
f-25
d-20
e-20
此外,如果有六个值,四个值相同:
var obj2 = {a:1, b:1, c:1, d:1, e:0,8, f: 0,5};
我需要展示4个最高的
最高值:
a-1
b-1
c-1
d-1
我想需要迭代所有对象属性才能得到Math.max,但我还需要一个东西来计算3个最大值和它们的键,如果有更多的max,我仍然需要得到它们
编辑:atm有很好的答案,所以我想我不会完成这段代码,只使用给定的示例:因此,您希望找到前3位最高值,如果有多个相同的最高值,那么您希望包括所有这些 这个问题是以一种有点奇怪的方式提出的 我假设如果有像a:1B:1C:2D:2E:3这样的东西, 你想包括a、b、c和d 首先,您只需跟踪关键点,因为您可以在最后立即获得值 好的!让我们开始吧。高效但丑陋
class Numandamount {
constructor(number, amount) {
this.number = number;
this.amount = amount;
}
}
//That's just a class to link numbers and their amounts
var numtoamount = [];
//Now let's fill that array!
for (var property in obj) {
if (obj.hasOwnProperty(property)) {
var num = obj.property;
var found = false;
for(Numandamount naa in numtoamount){
if(naa.number == num){
naa.amount++;
found = true;
}
}
if(!found){
naa.push(new Numandamount(num,1));
}
}
}
//The array is done!
numtoamount.sort(function(a,b){return b.number-a.number});
//Now all we have to do is loop through it!
var count = 0; // keep track of how many we did
var i = 0;
while(count<4 && i<numtoarray.length){
count += numtoamount[i].amount;
i++;
}
//BOOOM WE DID IT
// I is the biggest index so all we have to do is:
for(var j = 0;j<i;j++){
console.log("We have "+numtoamount[j].amount+" "+numtoamount[j].number+"'s");
}
例如,它将为这个示例打印obj:{a:1b:1c:4d:6e:7f:4}
我们有17个
我们有16个
我们有2个4个
如果您想要其他实现,请在下面进行评论!
我把我的心放在这个上,所以,你想找到前三名,如果有多个相同的最高点,那么你想包括所有这些 这个问题是以一种有点奇怪的方式提出的 我假设如果有像a:1B:1C:2D:2E:3这样的东西, 你想包括a、b、c和d 首先,您只需跟踪关键点,因为您可以在最后立即获得值 好的!让我们开始吧。高效但丑陋
class Numandamount {
constructor(number, amount) {
this.number = number;
this.amount = amount;
}
}
//That's just a class to link numbers and their amounts
var numtoamount = [];
//Now let's fill that array!
for (var property in obj) {
if (obj.hasOwnProperty(property)) {
var num = obj.property;
var found = false;
for(Numandamount naa in numtoamount){
if(naa.number == num){
naa.amount++;
found = true;
}
}
if(!found){
naa.push(new Numandamount(num,1));
}
}
}
//The array is done!
numtoamount.sort(function(a,b){return b.number-a.number});
//Now all we have to do is loop through it!
var count = 0; // keep track of how many we did
var i = 0;
while(count<4 && i<numtoarray.length){
count += numtoamount[i].amount;
i++;
}
//BOOOM WE DID IT
// I is the biggest index so all we have to do is:
for(var j = 0;j<i;j++){
console.log("We have "+numtoamount[j].amount+" "+numtoamount[j].number+"'s");
}
例如,它将为这个示例打印obj:{a:1b:1c:4d:6e:7f:4}
我们有17个
我们有16个
我们有2个4个
如果您想要其他实现,请在下面进行评论!
我全身心投入到这这是一个示例实现,带有注释来解释每一步发生的事情 函数maxValueso,n{ //获取对象值并按降序排序 const values=Object.valueso.sorta,b=>b-a; //检查是否存在超过所需数量的值 如果values.length=maxN return Object.entrieso .reduceo[k,v]=>v>=maxN?{…o[k]:v}:o,{}; } 常数a=最大值{ a:5, b:10, c:15, d:20, e:20, f:25 }, 3; console.loga; 常数b=最大值{ 答:1,, b:1, c:1, d:1, e:0.8, f:0.5 }, 3; console.logb; 常数c=最大值{ a:5, b:10, }, 3;
console.logc 这是一个示例实现,带有注释来解释每一步发生的事情 函数maxValueso,n{ //获取对象值并按降序排序 const values=Object.valueso.sorta,b=>b-a; //检查是否存在超过所需数量的值 如果values.length=maxN return Object.entrieso .reduceo[k,v]=>v>=maxN?{…o[k]:v}:o,{}; } 常数a=最大值{ a:5, b:10, c:15, d:20, e:20, f:25 }, 3; console.loga; 常数b=最大值{ 答:1,, b:1, c:1, d:1, e:0.8, f:0.5 }, 3; console.logb; 常数c=最大值{ a:5, b:10, }, 3;
console.logc 我将首先将对象转换为对象数组:
const arr = []
for (var key in obj){
arr.push( {[key]: obj[key]} )
}
现在您有了一个如下所示的数组:
var obj = {a : 5, b : 10, c : 15, d : 20, e : 20, f : 25};
[
{f:25},
{d:20},
{e:20},
{c:15},
{b:10},
{a:5}
]
现在,您可以根据对象值的大小对对象进行排序:
const sortedArray = arr.sort( (a,b) => {
if (Object.values(a)[0] > Object.values(b)[0]) {
return -1
}
})
这将使:
[
{"f": 25},
{"d": 20},
{"e": 20},
{"c": 15},
{"b": 10},
{"a": 5}
]
然后,您可以从顶部选择所需的值。比如说
sortedArray.filter项目,索引=>{
如果索引{
如果Object.valuesa[0]>Object.valuesb[0]{
返回-1
}
}
const endresult=sortedArray.filter项,索引=>{
如果索引,我将从将对象转换为对象数组开始:
const arr = []
for (var key in obj){
arr.push( {[key]: obj[key]} )
}
现在您有了一个如下所示的数组:
var obj = {a : 5, b : 10, c : 15, d : 20, e : 20, f : 25};
[
{f:25},
{d:20},
{e:20},
{c:15},
{b:10},
{a:5}
]
现在,您可以根据对象值的大小对对象进行排序:
const sortedArray = arr.sort( (a,b) => {
if (Object.values(a)[0] > Object.values(b)[0]) {
return -1
}
})
这将使:
[
{"f": 25},
{"d": 20},
{"e": 20},
{"c": 15},
{"b": 10},
{"a": 5}
]
然后你可以从顶部选择你想要的数值
sortedArray.filter项目,索引=>{
如果索引{
如果Object.valuesa[0]>Object.valuesb[0]{
返回-1
}
}
const endresult=sortedArray.filter项,索引=>{
如果指数简单
根据对象的值,使用,
获取可以筛选的最小值。
使用筛选条目并作为对象返回。
函数getTopValuesobj,topN
{
var sortedEntries=Object.entriesobj.sortfunctiona,b{返回b[1]-a[1]};
var last=分类齿[topN-1][1];
var结果=sortedEntries.filterfunctionentry{
R
eturn条目[1]>=最后一个;
};
console.logObject.fromEntrieResult;
}
getTopValues{a:5,b:10,c:15,d:20,e:20,f:25},3;
getTopValues{a:1,b:1,c:1,d:1,e:0.8,f:0.5},3;
getTopValues{a:1,b:1,c:1,d:1,e:0.8,f:0.5},5 简单地说
根据对象的值,使用,
获取可以筛选的最小值。
使用筛选条目并作为对象返回。
函数getTopValuesobj,topN
{
var sortedEntries=Object.entriesobj.sortfunctiona,b{返回b[1]-a[1]};
var last=分类齿[topN-1][1];
var结果=sortedEntries.filterfunctionentry{
返回条目[1]>=最后一个;
};
console.logObject.fromEntrieResult;
}
getTopValues{a:5,b:10,c:15,d:20,e:20,f:25},3;
getTopValues{a:1,b:1,c:1,d:1,e:0.8,f:0.5},3;
getTopValues{a:1,b:1,c:1,d:1,e:0.8,f:0.5},5;你概述的方法听起来不错。您在实施该方法方面取得了多大进展?您在哪里遇到了问题?以您概述的方式提供JavaScript听起来是个不错的方法。您在实施该方法方面取得了多大进展?你在哪里遇到了问题?在一个例子中提供JavaScript,这对于第二个例子来说是不起作用的,其中有四个1。你是对的。我编辑了我的答案。最后一步将包括与最高值一样高的任何其他值。这不适用于第二个示例,其中有四个1。你是对的。我编辑了我的答案。最后一步将包括与最高值一样高的任何其他值。您能否详细说明v>=maxN?{…o,[k]:v}:o,{}我用过你的代码,它工作得很好!但是我对……有问题。。。理解:我从未见过这样的条件运算符。Reduce将['a':5]作为'o'累加器,将['b':10]作为currentValue。第一个循环后的参数是什么?该死的,这段代码对我来说太复杂了:@Proo1931-我已经编辑了我的答案,包括关于所用代码的更多解释,并链接到相关的MDN页面以获得更深入的解释。我希望这能有所帮助。非常好的描述。现在一切都清楚了,你已经描述了我心中的每一个问题,所以我开始相信心灵感应:。我只是不知道可以为两个参数编写一个函数,然后在reduce方法中添加第三个参数。我确实使用了调试器,并在代码评估的每一步检查了我的结果估计,我了解所有事情。谢谢,我学到了很多!你能详细说明一下v>=maxN吗?{…o,[k]:v}:o,{}我用过你的代码,它工作得很好!但是我对……有问题。。。理解:我从未见过这样的条件运算符。Reduce将['a':5]作为'o'累加器,将['b':10]作为currentValue。第一个循环后的参数是什么?该死的,这段代码对我来说太复杂了:@Proo1931-我已经编辑了我的答案,包括关于所用代码的更多解释,并链接到相关的MDN页面以获得更深入的解释。我希望这能有所帮助。非常好的描述。现在一切都清楚了,你已经描述了我心中的每一个问题,所以我开始相信心灵感应:。我只是不知道可以为两个参数编写一个函数,然后在reduce方法中添加第三个参数。我确实使用了调试器,并在代码评估的每一步检查了我的结果估计,我了解所有事情。谢谢,我学到了很多!