更新对象数组

时间:2014-11-10 19:40:07

标签: javascript arrays angularjs angularjs-scope

亲爱的Stackoverflowers,

我写信给你,因为我对简单编程范式的理解在遇到一个不能简单的问题时被彻底摧毁了。

我有一个简单的Angular.js $scope函数,该函数在angular-sortable-view sv-on-stop事件后调用。 param items等于变量$part,它包含新的(已排序的)对象数组(对于此问题不是必需的):

$scope.update = function(items) {
    var data = [{
        'id': 'ZZZZ',
        'order': 2
    },{
        'id': 'AAAA',
        'order': 1
    },{
        'id': 'HHHH',
        'order': 0
    }];
    console.log(data);
    for(var i=0;i<data.length;i++) {
        data[i].order = i;
    };
    console.log(data);
}

第一个console.log到控制台的预期输出:

data [{id:'ZZZZ',order:2},{id:'AAAA',order:1},{id:'HHHH',order:0}]

第一个console.log到控制台的实际输出:

data [{id:'ZZZZ',order:0},{id:'AAAA',order:1},{id:'HHHH',order:2}]

第二个console.log返回完全相同的内容。 Angular.js是否使用某种预缓存或其他东西,因为第一个console.log返回已排序的对象数组?我非常感谢Stackoverflow风格的简短解释。提前谢谢!

2 个答案:

答案 0 :(得分:0)

某些浏览器中的

console.log()在传递对象时会有一些奇怪的时间(就像你正在做的那样)。我建议你试试这个:

$scope.update = function(items) {
    var data = [{
        'id': 'ZZZZ',
        'order': 2
    },{
        'id': 'AAAA',
        'order': 1
    },{
        'id': 'HHHH',
        'order': 0
    }];
    console.log(JSON.stringify(data));
    for(var i=0;i<data.length;i++) {
        data[i].order = i;
    };
    console.log(JSON.stringify(data));
}

消除任何这些时间问题。

理论是console.log()必须将数据编组到另一个进程,这需要一些时间并在后台完成。当你传递一个对象时,它不会复制该对象(它只是挂在引用上),但它也不会立即处理对象上的数据。因此,如果您立即修改了该对象,则您的第一个console.log()可能无法在适当的时间显示该对象的状态。

我不知道哪些浏览器受此影响,但我知道我自己在Chrome中看到了这个问题。

答案 1 :(得分:0)

如果您使用的是Chrome开发工具,则可能会看到最新值,而不是写入控制台时的值。

试试这个:

console.log(JSON.stringify(data, null, 4));