从对象中获取最大的键值对而不使用for循环

3
var obj={'one':1,'two':50,'three':75,'four':12}

这是一个对象,我希望输出为“three”:75,这是键值对的最大值。 我的限制是不使用for循环和任何库。 是否可能?

1
除非您在将值插入对象时可以访问该项,然后您可以始终保持本地最大值,否则这是不可能的。但是否则是不可能的。 - LiranBo
你必须循环遍历该项。 - MoLow
这是可能的,但不是最好/可靠的方法。Math.max.apply(Math.max, JSON.stringify(obj).match(/\d+/g)); - Tushar
那么 while 循环呢? - user663031
“没有库”是指不能使用任何内置函数吗? - Rajdeep Paul
没有库指的是外部库,例如jquery、underscore等。 - Optimus
4个回答

4

顺便说一下,我找到了另一种解决方案,但它也使用了循环。

var obj = {'one': 1, 'two': 50, 'three': 75, 'four': 12};

var maxKey = Object.keys(obj).sort(function (a, b) {
  return obj[a] < obj[b];
})[0];

var result = {};
result[maxKey] = obj[maxKey];

2

我用循环写的解决方案。

var obj = {'one':1,'two':50,'three':75,'four':12} ; 

var maxKey = Object.keys(obj).reduce(function (prev, next){ 
                 return obj[prev] > obj[next] ? prev : next; 
             });

var result = {};
result[maxKey] = obj[maxKey];

console.log(result);

1
但这正是一个循环。 - user663031
@torazaburo,原帖明确要求不使用for循环。 - Andy
但是问题在于,这里只输出了值,而没有输出键和值。 - Andy
所有上述解决方案也都使用了map函数,而map函数本质上又是一个循环。但是相比之前的解决方案,我更倾向于这个解决方案。 - Optimus
@Optimus - 自从昨天Isa更改后,现在已经更新了。 - Andy

1

如果你愿意稍微改变一下你的数据结构,就可以做到这点。不要使用一个对象,而是使用对象数组,然后使用filter根据最大值获取对象:

var arr = [
    { key: 'one', value: 1 },
    { key: 'two', value: 50 },
    { key: 'three', value: 75 },
    { key: 'four', value: 12 }
];

var max = Math.max.apply(null, arr.map(function (el) {
  return el.value;
}));

var output = arr.filter(function (el) {
  return el.value === max;
})[0];

console.log(out.key + ': ' + out.value); // three: 75

演示


0

你可以根据给定对象的结构创建一个新的对象

var newObject = [
    { key: 'one', value: 1 },  // key value structure
    { key: 'two', value: 50 },
    { key: 'three', value: 75 },
    { key: 'four', value: 12 }
 ];

var obj = {
    'one': 1,
    'two': 50,
    'three': 75,
    'four': 12
}

var newObJ = Object.keys(obj).map(function (key) {
    return {
        "key": key,
            "value": obj[key]
    }
});
var max = Math.max.apply(null, newObJ.map(function (el) {
    return el.value;
}));

var output = newObJ.filter(function (el) {
    return el.value === max;
})[0];

document.write(output.key + ': ' + max);


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接