如何从函数中更改对象的属性

时间:2015-12-16 15:29:01

标签: javascript node.js recursion pass-by-reference

我有以下函数将具有可变深度的最深值的对象重置为0.我希望函数在函数范围之外更改对象的属性;

    var object =
        { '1': {
                '10000': { '0': 6, '15': 3, '35': 5, '55': 3, '75': 85 },
            }
        } 

    function resetCounts(obj) {
        for (var el in obj) {
            if (obj.hasOwnProperty(el)) {
                if (typeof obj[el] == 'number') {
                    if (obj[el] > 0) {
                        console.log(obj)
                        console.log(obj[el]);
                        obj[el] = 0;
                        console.log('reset');
                        console.log(obj);
                        console.log(obj[el]);
                    }
                    return;
                }
                resetCounts(obj[el]);
            }
        }
    }

resetCounts(object);

以下是控制台中的结果:

{ '0': 6, '15': 3, '35': 5, '55': 3, '75': 85 }
6
reset
{ '0': 0, '15': 3, '35': 5, '55': 3, '75': 85 }
0

预期结果是object为:

        { '1': {
                '10000': { '0': 0, '15': 0, '35': 0, '55': 0, '75': 0 },
            }
        } 

知道如何实现这一目标吗?如何将值传递给父对象?

1 个答案:

答案 0 :(得分:2)

问题是“回归”;从函数返回,从而只保留第一个项目。这是一个小提琴:

https://jsfiddle.net/mckinleymedia/rbf26hcw/

function resetCounts(obj) {
  for (var el in obj) {
    if (obj.hasOwnProperty(el)) {
      if (typeof obj[el] == 'number') {
        if (obj[el] > 0) {
          obj[el] = 0;
        }
      }
      obj[el] = resetCounts(obj[el]);
    }
  }
  return obj;
};
var counts = { '0': 6, '15': 3, '35': 5, '55': 3, '75': 85 };
console.log(counts);
counts = resetCounts(counts);
console.log(counts);

所以你知道,使用lodash,如果你在那里得到了计数并且你不需要重置深数字,你可以用这个重置每个标签:

_.each(counts, function(v,k){ counts[k] = 0; });