【问题标题】:Manipulating JSON with LoDash使用 LoDash 操作 JSON
【发布时间】:2015-03-21 19:21:38
【问题描述】:

我刚刚开始使用 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;
}

问候 - - - 真是一头雾水的“程序员”

【问题讨论】:

    标签: javascript json underscore.js lodash


    【解决方案1】:

    如果我理解正确,当您使用_.mapValues 时,将应用 avg 函数。但是当您使用 map 函数时,您在 return 中设置的结果不会存储在任何地方,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.keys(dataSet.json) 之类的操作将其属性转换为数组。

    【讨论】:

    • 啊,好的,谢谢。所以几乎,只要我有一个返回值,我需要确保它被分配给某个东西。最初当我尝试分配它时,我使用“day”而不是“dataSet.json [index]”......所以这也是我的问题哈哈。再次感谢 Nachoooooo
    • 好吧,并非总是如此,但对于地图功能来说是的。此外,当使用 day 时它不起作用,因为您要替换该时间变量的值。但是,使用 dataSet.json[index],您更改了 dataSet.json 变量的值,因此它仍然存在。提醒一下,在 forEach / map 中,如果您希望数据持久化,则需要使用索引技巧或能够执行以下操作:_.each(dataSet.json, function(day, index) { day.hour = _.mapValues(day, function(n) { ... 即时间变量内的属性,这样它也保留在 dataSet.json 变量中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-01
    • 1970-01-01
    • 2023-03-26
    • 1970-01-01
    • 2021-12-17
    • 2019-03-14
    相关资源
    最近更新 更多