关于AngularJS:通过JavaScript对象循环的最佳实践

best practice looping through javascript object

本问题已经有最佳答案,请猛点这里访问。

我有以下JS对象,我需要将parsefloat应用于任何数值字段(以便ngtable正确排序)。

我很难通过这个物体来完成这个任务。我试过嵌套angular.foreach,但有范围问题(内部循环看不到外部变量)。

最好的方法是什么?

编辑:应该提到对象名(即:人、个人详细信息)是动态的。:

我的目的是:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
{
   "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
2
3
4
5
6
7
8
9
10
11
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

并在所有节点上重复出现,overkill示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
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}]}