Javascript 如何从对象中的相似组中查找最大值

Javascript 如何从对象中的相似组中查找最大值,javascript,loops,object,Javascript,Loops,Object,我有一个这样的物体 obj = { 'ab-adf': 2, 'ab-d': 3, 'cd-23': 1, 'cd-df': 5, 'ef-a': 3, 'ef-nb': 4 }; 预期的输出数或字符串:每个ab、cd和ef组3、5、4 我也在寻找解决方案,以打印出像这样的ab asdf=8,cd ed=6等,它应该保持原来的名称后有一个“=”符号 我知道最传统的方法是使用循环并返回最大值 var max = -Infinity, x; for( x in obj) {

我有一个这样的物体

obj = {
 'ab-adf': 2,
 'ab-d': 3,  
 'cd-23': 1,
 'cd-df': 5,
 'ef-a': 3,
 'ef-nb': 4
};
预期的输出数或字符串:每个ab、cd和ef组3、5、4

我也在寻找解决方案,以打印出像这样的ab asdf=8,cd ed=6等,它应该保持原来的名称后有一个“=”符号

我知道最传统的方法是使用循环并返回最大值

var max = -Infinity, x;
for( x in obj) {
    if( x.slice(0,2)==='ab' && obj[x] > max) max = obj[x];
    if( x.slice(0,2)==='cd' && obj[x] > max) max = obj[x];
    if( x.slice(0,2)==='ef' && obj[x] > max) max = obj[x];
 //how to return max value from each group ?
}

首先,JavaScript将无法解释对象,因为键中有特殊字符。您需要像这样用引号将键包装起来:

obj = {
 'ab-xxx': 2,
 'ab-yyy': 3,  
 'cd-xxx': 1,
 'cd-yyy': 6,
 'cd-zzz': 5,
 'ef-xxx': 3,
 'ef-yyy': 4,
};
接下来,您将要存储每个组的最大值,然后加入最大值以获得您正在寻找的字符串作为输出

// Get the max values for each prefix
var max = {};
for(var key in obj) {
  var prefix = key.slice(0,2);
  if (max[prefix] === undefined || max[prefix] < obj[key]){
    max[prefix] = obj[key];
  }
}

// Concatenate the max values into a string
var maxString = '';
for(key in max){
  maxString += max[key] + ' ';
}
maxString = maxString.trim();
//获取每个前缀的最大值
var max={};
for(obj中的var键){
var前缀=key.slice(0,2);
如果(最大[前缀]==未定义| |最大[前缀]
编辑:

是的,基本上我也在寻找解决方案来打印出来,就像 此ab asdf=8,cd ed=6等,应保留原始名称和 “=”在后面签名

要实现此输出,可以通过以下方式进行:

// Get the max values for each prefix, and store the max as a string
var max = {};
for(var key in obj) {
  var prefix = key.slice(0,2);
  if (max[prefix] === undefined || +max[prefix].split('=')[1] < obj[key]){
    max[prefix] = key + '=' + obj[key];
  }
}

// Concatenate the max values into a string
var maxString = '';
for(key in max){
  maxString += max[key] + ', ';
}
maxString = maxString.trim();
//获取每个前缀的最大值,并将最大值存储为字符串
var max={};
for(obj中的var键){
var前缀=key.slice(0,2);
如果(max[prefix]==undefined | |+max[prefix].split('=')[1]
首先,JavaScript无法解释对象,因为键中有特殊字符。您需要像这样用引号将键包装起来:

obj = {
 'ab-xxx': 2,
 'ab-yyy': 3,  
 'cd-xxx': 1,
 'cd-yyy': 6,
 'cd-zzz': 5,
 'ef-xxx': 3,
 'ef-yyy': 4,
};
接下来,您将要存储每个组的最大值,然后加入最大值以获得您正在寻找的字符串作为输出

// Get the max values for each prefix
var max = {};
for(var key in obj) {
  var prefix = key.slice(0,2);
  if (max[prefix] === undefined || max[prefix] < obj[key]){
    max[prefix] = obj[key];
  }
}

// Concatenate the max values into a string
var maxString = '';
for(key in max){
  maxString += max[key] + ' ';
}
maxString = maxString.trim();
//获取每个前缀的最大值
var max={};
for(obj中的var键){
var前缀=key.slice(0,2);
如果(最大[前缀]==未定义| |最大[前缀]
编辑:

是的,基本上我也在寻找解决方案来打印出来,就像 此ab asdf=8,cd ed=6等,应保留原始名称和 “=”在后面签名

要实现此输出,可以通过以下方式进行:

// Get the max values for each prefix, and store the max as a string
var max = {};
for(var key in obj) {
  var prefix = key.slice(0,2);
  if (max[prefix] === undefined || +max[prefix].split('=')[1] < obj[key]){
    max[prefix] = key + '=' + obj[key];
  }
}

// Concatenate the max values into a string
var maxString = '';
for(key in max){
  maxString += max[key] + ', ';
}
maxString = maxString.trim();
//获取每个前缀的最大值,并将最大值存储为字符串
var max={};
for(obj中的var键){
var前缀=key.slice(0,2);
如果(max[prefix]==undefined | |+max[prefix].split('=')[1]
您可以动态生成
max
对象,而无需硬编码组名:

obj={
“ab-1”:9,
“ab-2”:3,
“cd-1”:1,
“cd-2”:5,
“ef-1”:3,
“ef-2”:4,
};
max=[],group=null;
Object.keys(obj.sort().forEach(函数(键)){
var g=密钥substr(0,2);
if(g==组)
max.push(Math.max(max.pop(),obj[key]);
否则{
组=g;
最大推力(obj[键]);
}
});

document.write(“+JSON.stringify(max))
您可以动态生成
max
对象,而无需硬编码组名:

obj={
“ab-1”:9,
“ab-2”:3,
“cd-1”:1,
“cd-2”:5,
“ef-1”:3,
“ef-2”:4,
};
max=[],group=null;
Object.keys(obj.sort().forEach(函数(键)){
var g=密钥substr(0,2);
if(g==组)
max.push(Math.max(max.pop(),obj[key]);
否则{
组=g;
最大推力(obj[键]);
}
});

document.write(“+JSON.stringify(max))
这将使用第一个对象的最大值创建一个新对象:

var obj={
“ab xxx”:2,
“ab yyy”:3,
“cd xxx”:1,
“cd yyy”:5,
“ef xxx”:3,
“ef yyy”:4
},
newobj={};
用于(obj中的var i){
var key=i.split('-')[0];
newobj[key]=Math.max(newobj[key]| |-无穷大,obj[i]);
}

document.body.innerHTML=JSON.stringify(newobj)这将创建具有第一个对象最大值的新对象:

var obj={
“ab xxx”:2,
“ab yyy”:3,
“cd xxx”:1,
“cd yyy”:5,
“ef xxx”:3,
“ef yyy”:4
},
newobj={};
用于(obj中的var i){
var key=i.split('-')[0];
newobj[key]=Math.max(newobj[key]| |-无穷大,obj[i]);
}

document.body.innerHTML=JSON.stringify(newobj)是否要返回最大值数组?首选数字或字符串在同一对象中不能有两个同名键,并且除非键带引号,否则对象键中不能有减号。我看不出这是怎么可能的。xxx=不同的值。不同的钥匙。是的,它们显然是引号。那不是问题。你想返回一个最大值数组吗?首选数字或字符串在同一个对象中不能有两个同名键,并且除非键在引号中,否则对象键中不能有减号。我看不出这是怎么可能的。xxx=不同的值。不同的钥匙。是的,很明显,它们应该是引号。那不是问题。谢谢你的回答,但是如果我需要得到值9,5,4,我必须再次使用for in-loop来得到它们。只是好奇是否有一种方法可以通过只循环一次来获得结果?谢谢你的回答,但是如果我需要得到值9,5,4,我必须再次使用for in-loop来获得它们。只是好奇是否只有一次循环才能得到结果?<代码> > <代码>在这里是危险的,请考虑<代码> AB XXX:- 1,AB YYY:- 2 < /代码>。请解释Max.Max()的部分吗?我知道如何使用Math.max,但不是你使用它的方式。如果我能在这里