Javascript中嵌套对象值的平均值

Javascript中嵌套对象值的平均值,javascript,lodash,Javascript,Lodash,问这个问题似乎很尴尬,但我不知道该怎么办 我有一个嵌套对象数组,我想创建一个新对象,该对象具有原始数组的平均值 const _ = require(`lodash`) const data = JSON.parse(` [ { "thingOne": { "numberOne": 1758, "numberTwo": 97 }, "thingTwo": { "numberOne": 1758,

问这个问题似乎很尴尬,但我不知道该怎么办

我有一个嵌套对象数组,我想创建一个新对象,该对象具有原始数组的平均值

const _ = require(`lodash`)

const data = JSON.parse(`
[
  {
      "thingOne": {
          "numberOne": 1758,
          "numberTwo": 97
      },
      "thingTwo": {
          "numberOne": 1758,
          "numberTwo": 97
      }
  },
  {
      "thingOne": {
          "numberOne": 1968,
          "numberTwo": 95
      },
      "thingTwo": {
          "numberOne": 2010,
          "numberTwo": 95
      }
  }
]`)

const results = {}

_.each(data, (value, key) => {
  _.each(value, (value, key) => {
    if (key in results) {
      results[key] = {
        numberOne: results[key].numberOne + value.numberOne,
        numberTwo: results[key].numberTwo + value.numberTwo,
      }
    } else {
      results[key] = value
    }
  })
})

console.log(results)
我可以这样做,将数组汇总成一个新对象,但我不确定从这里该做什么。我是否需要再次循环此项以创建平均值?感谢您的帮助,如果有更简单的答案,我不需要使用lodash

以下是我希望最终得到的:

const expected = {
  thingOne: {
    numberOne: 1863,
    numberTwo: 96,
  },
  thingTwo: {
    numberOne: 1884,
    numberTwo: 96,
  },
}

注意,您使用了lodash,您可以利用u.mergeWith:

来自lodash:

此方法类似于u.merge,只是它接受 调用以生成目标和源的合并值 财产。如果customizer返回undefined,则合并由 方法。使用六个参数调用自定义程序: objValue、srcValue、键、对象、源、堆栈

在我们的例子中,customizer方法检索平均值,而不是合并值

const data=JSON.parse` [ { thingOne:{ 号码:1758, 号码二:97 }, 第二点:{ 号码:1758, 号码二:97 } }, { thingOne:{ 号码:1968年, 号码二:95 }, 第二点:{ 编号:2010年, 号码二:95 } } ]`; const getAvg=data=>{ 如果是的话{ 返回b | | 0/data.length+|.isNumbera?a | | 0:0; } }; console.loggetAvgdata;
注意,您使用了lodash,您可以利用u.mergeWith:

来自lodash:

此方法类似于u.merge,只是它接受 调用以生成目标和源的合并值 财产。如果customizer返回undefined,则合并由 方法。使用六个参数调用自定义程序: objValue、srcValue、键、对象、源、堆栈

在我们的例子中,customizer方法检索平均值,而不是合并值

const data=JSON.parse` [ { thingOne:{ 号码:1758, 号码二:97 }, 第二点:{ 号码:1758, 号码二:97 } }, { thingOne:{ 号码:1968年, 号码二:95 }, 第二点:{ 编号:2010年, 号码二:95 } } ]`; const getAvg=data=>{ 如果是的话{ 返回b | | 0/data.length+|.isNumbera?a | | 0:0; } }; console.loggetAvgdata;
你运行通过关键点和解决如下

const data=JSON.parse` [ { thingOne:{ 号码:1758, 号码二:97 }, 第二点:{ 号码:1758, 号码二:97 } }, { thingOne:{ 号码:1968年, 号码二:95 }, 第二点:{ 编号:2010年, 号码二:95 } } ]`; 让预期={}; data.forEachfunctionthing{ 让parentKeys=Object.keysthing; parentKeys.forEachfunctionparentKey{ 如果!应为。hasOwnPropertyparentKey{ 应为[parentKey]={}; } 让expectedParent=expected[parentKey]; 让parent=thing[parentKey]; 让childKeys=Object.keysparent; childKeys.forEachfunctionchildKey{ 如果!expectedParent.hasOwnPropertychildKey{ expectedParent[childKey]=0; } expectedParent[childKey]+=parent[childKey]/parentKeys.length; }; }; };
console.logexpected 你运行通过关键点和解决如下

const data=JSON.parse` [ { thingOne:{ 号码:1758, 号码二:97 }, 第二点:{ 号码:1758, 号码二:97 } }, { thingOne:{ 号码:1968年, 号码二:95 }, 第二点:{ 编号:2010年, 号码二:95 } } ]`; 让预期={}; data.forEachfunctionthing{ 让parentKeys=Object.keysthing; parentKeys.forEachfunctionparentKey{ 如果!应为。hasOwnPropertyparentKey{ 应为[parentKey]={}; } 让expectedParent=expected[parentKey]; 让parent=thing[parentKey]; 让childKeys=Object.keysparent; childKeys.forEachfunctionchildKey{ 如果!expectedParent.hasOwnPropertychildKey{ expectedParent[childKey]=0; } expectedParent[childKey]+=parent[childKey]/parentKeys.length; }; }; };
console.logexpected 下面是对MosèRaguzzini代码中发生的事情的解释

代码本质上是对输入的每个值执行滚动平均

e、 g.上一个值+=当前值/总值

见:

const DEBUG=true; 风险值数据=[{ thingOne:{numberOne:1758,numberTwo:97}, 事情二:{numberOne:1758,numberTwo:97} }, { thingOne:{numberOne:1968,numberTwo:95}, 事情二:{numberOne:2010,numberTwo:95} }, { thingOne:{numberOne:1,numberTwo:1}, 事情二:{numberOne:1,numberTwo:1} }]; console.logcalculateRollingAveragedata; /** *计算数据的滚动平均值。 * *上一个值+=当前值/总值 * *@param data{object[]}-数据对象数组 *@return返回每个数据对象字段的滚动平均值。 */ 函数计算器ollingaveragedata{ 返回{}与{},…数据合并,上一个,当前=>{ 如果调试{ console.log`prev=${JSON.stringifyprev}| curr=${JSON.stringifycurr}`; } 如果uu.isNumbercurr{ 设p=u.isNumberprev?prev | | 0:0,c=curr | | 0/data.length; 如果调试{ log`avg=>${p}+${curr}/${data.length}=${p+c}`; } 返回p+c; } }; } .作为控制台包装{top:0;最大高度:100%!重要;}
下面是对MosèRaguzzini代码中发生的事情的解释

代码本质上是对输入的每个值执行滚动平均

e、 g.上一个值+=当前值/总值

见:

const DEBUG=true; 风险值数据=[{ thingOne:{numberOne:1758,numberTwo:97}, 事情二:{numberOne:1758,numberTwo:97} }, { thingOne:{numberOne:1968,numberTwo:95}, 事情二:{numberOne:2010,numberTwo:95} }, { thingOne:{numberOne:1,numberTwo:1}, 事情二:{numberOne:1,numberTwo:1} }]; console.logcalculateRollingAveragedata; /** *计算数据的滚动平均值。 * *上一个值+=当前值/总值 * *@param data{object[]}-数据对象数组 *@return返回每个数据对象字段的滚动平均值。 */ 函数计算器ollingaveragedata{ 返回{}与{},…数据合并,上一个,当前=>{ 如果调试{ console.log`prev=${JSON.stringifyprev}| curr=${JSON.stringifycurr}`; } 如果uu.isNumbercurr{ 设p=u.isNumberprev?prev | | 0:0,c=curr | | 0/data.length; 如果调试{ log`avg=>${p}+${curr}/${data.length}=${p+c}`; } 返回p+c; } }; } .作为控制台包装{top:0;最大高度:100%!重要;}
非常感谢。我不能说我完全理解这一点,但它似乎确实起到了作用。@duffn合并后,自定义程序充当每个字段的值数组的减缩器。@Mr.polywhill文档对此非常清楚:如果自定义程序返回未定义的值,则由该方法处理合并。看看内部方法,似乎您已经从中复制了一些代码。当你从别人的答案中借用代码时,请务必引用你的来源。嗨@CodyGray,我在原始帖子中包含了信用,在使用文档更新时被错误删除,谢谢。我不能说我完全理解这一点,但它似乎确实起到了作用。@duffn合并后,自定义程序充当每个字段的值数组的减缩器。@Mr.polywhill文档对此非常清楚:如果自定义程序返回未定义的值,则由该方法处理合并。看看内部方法,似乎您已经从中复制了一些代码。当你从别人的答案中借用代码时,请务必引用你的来源。嗨@CodyGray,我在原始帖子中包含了信用,在使用文档更新时被错误删除,谢谢。我认为你是在做一个运行平均值,而不是总体平均值。我认为你是在做一个运行平均值,而不是总体平均值。
_.mergeWith(object, sources, customizer)