【问题标题】:how to find minimum and maximum value in object literal by javascript如何通过javascript查找对象文字中的最小值和最大值
【发布时间】:2015-05-09 17:59:29
【问题描述】:

我想从对象文字中获取最小值并想在 anuglarjs 中使用它,即:-

scope.data = {
    'studentName' : "Anand", 
    'socialStudies' : "98",
    'english' : "90",
    'math' : "80"
};

最初它将是单个对象,但在添加更多数据后它将就像数组数据一样。所以我想找出每一行的最小值和最大值。

我已经尝试了下面的最小值和最大值代码,但没有得到解决方案,因为它给了我“NaN”。

var maxVal = Math.max.apply(Math,scope.data);

请提出一些好的选择。我在angularjs中使用它。 等待您的回复。

我的整个代码如下:-

scope.save = function (item){
        scope.person = {
            'name' : scope.person.name, 
            'hindi' : scope.person.hindi,
            'english' : scope.person.english,
            'math' : scope.person.math
        };

        if(typeof rootScope.students === 'undefined'){
            rootScope.students = [];
            rootScope.students.push(scope.person);
        }else{
            rootScope.students.push(scope.person);
        }
        location.path("/");
    }

【问题讨论】:

  • 从您的问题中不清楚您想要做什么。最大值,最小值是什么?您是否正在寻找单个对象上任何属性的最小和最大数值?或者您是否有一个对象数组,并且您想要数组中每个对象的特定属性的最大值和最小值?另外,非数字属性呢?
  • 你的例子中的'max'是什么,98Anand?!
  • @A.Wolff: Anand 显然是最长的字符串:-)
  • 是的 @jfriend00 我有一种 HTML 格式。每当用户添加新记录时,我都想保存数据。我正在寻找 scope.data 对象的每个属性的最小和最大数值。请推荐!!
  • 什么意思,“就像数组数据一样”?你为什么不使用一个实际的数组(然后你的代码就可以工作了)?

标签: javascript jquery angularjs


【解决方案1】:

这是一种方法,它只检查数字属性并返回最大值和最小值及其对应的属性名称(因为我认为这会很有用):

scope.data = {
    'studentName' : "Anand", 
    'socialStudies' : "98",
    'english' : "90",
    'math' : "80"
};

function findMaxMin(obj) {
    var max = Number.MIN_VALUE, min = Number.MAX_VALUE, val;
    var maxProp, minProp;
    for (var prop in obj) {
        if (obj.hasOwnProperty(prop)) {
            val = +obj[prop];
            if (!isNaN(val)) {
                if (val > max) {
                    maxProp = prop;
                    max = val;
                }
                if (val < min) {
                    minProp = prop;
                    min = val;
                }
            }
        }
    }
    // if no numeric looking properties, then return null
    if (!maxProp) {
        return null;
    }
    return {minVal: min, minProp: minProp, maxVal: max, maxProp: maxProp};
}

工作演示:http://jsfiddle.net/jfriend00/q81g6ehb/


而且,如果你想在数组上使用它,你可以为每个数组元素调用它:

function findMaxMinArray(arr) {
    var results = [];
    for (var i = 0; i < arr.length; i++) {
        var m = findMaxMin(arr[i]);
        m.obj = arr[i];
        results.push(m);
    }
    return results;
}

工作演示:http://jsfiddle.net/jfriend00/uv50y3e8/


如果你想让它自动检测一个数组是否过去,并且总是返回一个结果数组,你可以这样做:

function findMaxMinAny(obj) {
    var results = [];
    if (Array.isArray(obj)) {
        for (var i = 0; i < arr.length; i++) {
            var m = findMaxMin(arr[i]);
            m.obj = arr[i];
            results.push(m);
        }
    } else {
        // only a single object
        results.push(findMaxMin(obj));
    }
    return results;
}

【讨论】:

  • 感谢@jfriend00,它在 jsfiddle 中运行良好。将在我的代码中检查并更新它。
  • 也需要一点帮助,它在多个对象的情况下不起作用。如果会有多个数据,则返回 null。 scope.data = [{ 'studentName' : "Anand", 'socialStudies' : "98", 'english' : "90", 'math' : "80" },{ 'studentName' : "deepak", 'socialStudies ':“98”,“英语”:“90”,“数学”:“80”}];
  • @Ananddeepsingh - 您没有在问题中指定。我可以马上调整我的答案。将来,请在您的问题中展示您希望它使用的所有数据类型的示例。您想要整个阵列的单个最大最小值吗?还是您想要一个最大/最小数组,每个学生一个?
  • @Ananddeepsingh - 结果是您只需要最大值/最小值,还是还需要知道最大值或最小值对应的科目和学生?
  • 我很抱歉模棱两可。我将需要每个学生的最小值和最大值。假设有 3 名学生,所以我想知道 1 号学生的最低分数为 80,最高分数为 90,2 号学生的最低分数为 56,最高分数为 80,3 号学生的最低分数为 34,最高分数为 45。
【解决方案2】:

使用jQuery.map() 将项目转换为新数组,如果回调返回 null 或 undefined 该项目将不被包括在内。您可以使用它来过滤结果(例如,删除非数值)。

var data = {
    'studentName' : "Anand", 
    'socialStudies' : "98",
    'english' : "90",
    'math' : "80"
};

var array = $.map( data, function( val ) { 
    return $.isNumeric( val ) ? val : null; 
});

console.log( Math.max.apply( null, array ) ); // 98

【讨论】:

  • 感谢 @danijel 的 sn-p 但它给了我数组“-Infinity”
猜你喜欢
  • 2019-04-22
  • 1970-01-01
  • 1970-01-01
  • 2018-04-08
  • 1970-01-01
  • 2012-09-16
  • 2017-09-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多