从 JSON 对象中返回最大值

7

我有一个关联数组,看起来像这样:

var data = {
    0: {
        'Number_of_Something': 212
    },
    1: {
        'Number_of_Something': 65
    },
    2: {
        'Number_of_Something': 657
    }
}

我需要提取字段Number_of_Something中的最高值,但是由于它是对象中的一个对象的字段,所以比仅遵循类似于这里概述的方法要复杂一些。

循环遍历该对象并存储该值,然后如果下一个值更大,则替换它似乎是最简单和明显的选项。

我只是想问一下是否有更简单(更聪明)的方法来实现这个目标,而不是上面概述的方法?


1
为什么data是一个对象而不是数组或至少类似于数组的对象? - Felix Kling
@FelixKling 这是从一个 PHP 脚本传递过来的 JSON 对象。我为了其他目的强制转换成对象 :) - Ben Carey
循环遍历对象成员有什么问题吗?这似乎非常简单、易于维护并且非常兼容。 - RobG
@RobG 绝对没有任何问题,但我只是想检查一下是否已经有任何JavaScript函数可以使这个过程更简单 :-) - Ben Carey
我不认为嵌套三个函数比基本循环更简单。可能代码稍微少一点,但肯定不是更简单。性能似乎有些复杂,整体上看起来并没有更快。性能测试 - RobG
2个回答

17

简单是一个主观的概念...... 另一种实现你所要求的方法是使用Object.keysArray.prototype.map 获取值的数组,并使用你链接的带有Math.max 的其他解决方案:

var data = {
    0: {
        'Number_of_Something': 212
    },
    1: {
        'Number_of_Something': 65
    },
    2: {
        'Number_of_Something': 657
    }
}

var max = Math.max.apply(null,
                        Object.keys(data).map(function(e) {
                                return data[e]['Number_of_Something'];
                        }));

它将需要为缺失的ES5功能(如 Object.keysmap)添加shims。 - RobG
如何返回具有最高数字的项目的索引? - Black

0

你可以创建自己的(for)循环并以此方式返回最大值。另一个选择是使用类库,例如Underscore.js来为您处理此操作并保持代码可读性。


好的,谢谢。简而言之,没有插件没有简单快捷的方法,我需要像我在问题中建议的那样循环遍历吗? - Ben Carey
嗯...插件也会在内部循环遍历对象/数组。没有其他解决方案。 - Bas Slagter
没错 :-). 我已经接受了 @Zapshu 的解决方案,因为它正好提供了我所需要的。无论如何还是谢谢。 - Ben Carey

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