2015-05-09 78 views
-1

我想從對象字面得到最小值,並希望在anuglarjs即使用它,: -如何找到對象的最大值和最小值的文字由JavaScript

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("/"); 
    } 
+0

從你的問題中不清楚你在幹什麼。最大,最小的是什麼?您是否在尋找單個對象上任何屬性的最小和最大數值?或者你有一個對象數組,你想要數組中每個對象的特定屬性的最大值和最小值?另外,非數字屬性呢? – jfriend00

+1

你的例子是'最大','98'還是'阿南德'? –

+1

@ A.Wolff:'Anand'顯然是最長的字符串:-) – Bergi

回答

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; 
} 
+0

謝謝@ jfriend00,它在jsfiddle中工作得很好。將在我的代碼中檢查並更新它。 –

+0

也需要小小的青睞,它不適用於多個對象的情況。如果有多個數據,則返回null。 scope.data = [{ 'studentName': 「阿南德」, 'socialStudies': 「98」, '英語': 「90」, '數學': 「80」 },{ 「studentName ':「deepak」, 'socialStudies':「98」, 'english':「90」, 'math':「80」 }]; –

+0

@Anddeepsingh - 你沒有在你的問題中指定。我可以在一瞬間調整我的答案。將來,請在您的問題中顯示您希望使用的所有類型的數據的示例。你想爲整個陣列提供一個最大分鐘嗎?或者你想要一個最大/最小的數組,每個學生一個? – jfriend00

0

使用jQuery.map()翻譯項目到NE w數組,如果回調返回null或未定義該項目將不被包含。您可以使用它來過濾結果(例如,刪除非數字值)。

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 
+0

感謝@danijel爲你的片段,但它給我陣列爲「-Infinity」 –

+0

這是一個工作[小提琴](https://jsfiddle.net/dt4qavz7/) – Danijel

相關問題