Javascript 用LoDash处理JSON

Javascript 用LoDash处理JSON,javascript,json,underscore.js,lodash,Javascript,Json,Underscore.js,Lodash,我刚刚开始使用Lodash,并尝试在数组的最低级别平均任何值。无论我尝试什么,原始JSON都会保持不变 我是否需要构建一个全新的对象并将所有内容都推入其中?为什么我不能像处理数组一样简单地处理它呢 function averageIt(mtcs) { function jsonAvg(dataSet) { function avg(elmt) { var sum = 0; for( var i = 0; elmt[i]; i++ ){ sum += par

我刚刚开始使用Lodash,并尝试在数组的最低级别平均任何值。无论我尝试什么,原始JSON都会保持不变

我是否需要构建一个全新的对象并将所有内容都推入其中?为什么我不能像处理数组一样简单地处理它呢

function averageIt(mtcs) {

function jsonAvg(dataSet) {

  function avg(elmt) {
    var sum = 0;
    for( var i = 0; elmt[i]; i++ ){
        sum += parseInt( elmt[i], 10 );
    }
    return Math.round(sum/elmt.length * 100) / 100;
  }

  _.forEach(dataSet.json, function(day) {
    _.mapValues(day, function(n) {
      return _.isArray(n) ? avg(n) : n;
    });
  });

  console.log("JSON Averaged:", dataSet.json);

  return dataSet;
}

_.forIn(mtcs.dataSets, function(set) {
  set = jsonAvg(set);
});

console.log("Averaged Metrics:", mtcs);

return mtcs;
}
问候
---如果我理解正确,当你使用时,程序员真的很困惑。mapValues是应用avg函数的地方。但是,当您使用map函数时,您在返回中设置的结果不会存储在任何位置,并且dataSet.json保持不变。您可以这样做:

_.each(dataSet.json, function(day, index) {
  dataSet.json[index] = _.mapValues(day, function(n) {
    return _.isArray(n) ? avg(n) : n;
  });
});

假设dataSet.json是一个数组。如果它是一个对象,则不应对其应用each,而应执行类似object.keysdataSet.json的操作,将其属性转换为数组。

Ahhh好的,谢谢。所以,只要我有一个返回值,我就需要确保它被分配给某个对象。最初,当我尝试分配它时,我使用day而不是dataSet.json[index]。。。所以这也是我的问题,哈哈。再次感谢Nachooooowell,不总是这样,但是地图功能不错。另外,当使用day时,它不起作用,因为您正在替换该时间变量的值。但是,使用dataSet.json[index],您可以更改dataSet.json变量的值,因此它将保持不变。只需提醒一下,在forEach/map中,如果希望数据持久化,则需要执行或使用索引技巧,或者能够执行以下操作:u.eachdataSet.json、functionday、index{day.hour=uu.mapValuesday、functionn{…即临时变量中的属性,这样它也会持久化到dataSet.json变量中。