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方法中添加第三个参数。我确实使用了调试器,并在代码评估的每一步检查了我的结果估计,我了解所有事情。谢谢,我学到了很多!