Javascript 循环中非原语值的意外修改

Javascript 循环中非原语值的意外修改,javascript,angularjs,javascript-objects,Javascript,Angularjs,Javascript Objects,我正在使用一种类型的角度服务: services.factory('SaveHistory', function($rootScope, $localForage){ return { videoAccessed: function(idPillola) { $localForage.getItem('trainings_user_'+$rootScope.user.id) .then(function(succ, err) {

我正在使用一种类型的角度服务:

services.factory('SaveHistory', function($rootScope, $localForage){
return {
    videoAccessed: function(idPillola) {
        $localForage.getItem('trainings_user_'+$rootScope.user.id)
            .then(function(succ, err) {
                for (var item in succ) {
                    [].forEach.call(succ[item], function(el, index) {
                        el.pillole.forEach(function(el, index){
                            if (el.idPercorso == idPillola) {
                                console.log(idPillola);
                                el.tracking.completion_status = 1;
                            }
                        });
                    });
                }
                var newTrainings = succ;
                ...
            });         
    }
当使用正确的IDPILLA触发函数时,console.log会一次性记录正确的IDPILLA值,因此循环似乎工作正常。但是:如果我要更改的对象(对象或嵌套forEach循环中的“el”)中的属性是基元,那么没有问题,如果该属性不是基元,而是另一个对象属性,如tracking.completion\u status在本例中,所有元素都会更新!(就像if控件被忽略一样)。
它与Angular或Javascript本身有关?

几乎肯定与事物的结构有关,您还没有向我们展示。请提供一个理想情况下使用堆栈片段(工具栏上的
按钮)的示例。另外:您真的打算对
el
进行阴影处理吗?
el.idPercorso
中的
el
el.pillole
中的
el
不同。我通常尝试在嵌套循环中使用不同的变量名,以避免混淆。(如果不打算使用第二个参数,也不需要声明它;您没有使用上面的
index
)当然,您是对的,但是工作代码很长。我只是想知道这个问题是否与任何客观模式有关。不过,谢谢你的建议,是的,我真的很想跟踪父亲“el”,因为除了获得他的pillole属性外,我不需要它,除此之外,我将删除索引参数,我只是习惯性地使用它。