2014-04-13 19 views
21

Tôi có đối tượng JS sau đây mà tôi cần phải áp dụng parseFloat cho bất kỳ trường giá trị số nào (để ngTable sắp xếp chính xác).thực hành tốt nhất lặp qua đối tượng javascript

Tôi đang gặp khó khăn trong việc lặp qua Object để thực hiện việc này. Tôi đã thử lồng nhau angular.forEach nhưng đang có vấn đề scoping (vòng bên trong không thấy biến bên ngoài).

Cách tốt nhất để tiếp cận điều này là gì?

Chỉnh sửa: nên đã đề cập rằng tên đối tượng (ví dụ: Person, PersonDetails) là động. :/

đối tượng của tôi: bìa

{ 
    "data": [ 
     { 
      "Person": { 
       "id" : "1", 
       "age": "23", 
       "days": "5", 
       "first_name": "Joe", 
       "last_name": "Smith", 
      }, 
      "PersonDetails": { 
       "id": "4", 
       "name": "Cousin", 
       "oldest: "2", 
      } 
     }, 
     { 
      "Person": { 
       "id" : "2", 
       "age": "18", 
       "days": "3", 
       "first_name": "John", 
       "last_name": "Doe", 
      }, 
      "PersonDetails": { 
       "id": "4", 
       "name": "Second Cousing", 
       "oldest: "3", 
      } 
     } 
     ... 
     ... 
    ] 
}; 
+1

Các sao tôi đã đăng lặp lại cả đối tượng và mảng, mặc dù tên của nó. –

+0

Bạn có thể tạo plnkr.co không? – Miraage

Trả lời

8

Bạn có thể làm một bài kiểm tra như thế này

function representsNumber(str) { 
    return str === (+str).toString(); 
} 

// e.g. usage 
representsNumber('a'); // false 
representsNumber([]); // false 
representsNumber(1); // false (it IS a number) 
representsNumber('1.5'); // true 
representsNumber('-5.1'); // true 
representsNumber('NaN'); // true 

Và recurse trên tất cả các nút của bạn, ví dụ overkill

function seeker(o, test, _true, _false) { 
    _true || (_true = function (e) {return e;}); 
    _false || (_false = function (e) {return e;}); 
    function recursor(o) { 
     var k; 
     if (o instanceof Array) 
      for (k = 0; k < o.length; ++k) // iterate over array 
       if (typeof o[k] !== 'object') 
        o[k] = test(o[k]) ? _true(o[k]) : _false(o[k]); 
       else 
        recursor(o[k]); 
     else 
      for (k in o) // iterate over object 
       if (typeof o[k] !== 'object') 
        o[k] = test(o[k]) ? _true(o[k]) : _false(o[k]); 
       else 
        recursor(o[k]); 
    } 
    if (typeof o === "object") return recursor(o), o; 
    else return test(o) ? _true(o) : _false(o); // not an object, just transform 
} 

// e.g. usage 
seeker({foo: [{bar: "20"}]}, representsNumber, parseFloat); 
// {foo: [{bar: 20}]} 
Các vấn đề liên quan