繁体   English   中英

如何在javascript中对对象数组中的值求和

[英]How to sum values in an array of objects in javascript

我有一个对象数组,如下所示:

[
    {
        Daypart: "G_POSTPEAK",
        day_of_week: "Monday",
        uplift: 1
    },
    {
        Daypart: "A_BREAKFAST",
        day_of_week: "Thursday",
        uplift: 1
    },
    {
        Daypart: "C_DAYTIME",
        day_of_week: "Sunday",
        uplift: 2
    },
    {
        Daypart: "G_POSTPEAK",
        day_of_week: "Monday",
        uplift: 2
    },
]

我只显示了数组中的一个对象示例,我正在处理更多的对象。 它们都具有指定的属性,daypart 属性可以是 8 个值之一,而星期几值可以是 7(星期几)之一。

我想返回具有相同 daypart 和 day_of_week 值的所有对象的 uplift 值的总和。

所以上面应该返回如下内容:

{
    G_POSTPEAK_Monday: {
        Daypart: "G_POSTPEAK",
        day_of_week: "Monday",
        uplift: 3
    },
    A_BREAKFAST_Thursday: {
        Daypart: "A_BREAKFAST",
        day_of_week: "Thursday",
        uplift: 1
    },

    C_DAYTIME_Sunday: {
        Daypart: "C_DAYTIME",
        day_of_week: "Sunday",
        uplift: 2
    }
}

感谢任何帮助

可以使用以下功能。 我用过 ES6。 该函数inputs ,这将是你的输入对象。

 const sumIt = (inputs) => { const result = {}; inputs.forEach((input) => { const key = `${input.Daypart}_${input.day_of_week}`; if (key in result) { result[key].uplift = result[key].uplift + input.uplift; } else { result[key] = { ...input }; } }); return result; };

您可以使用 ES6 的 reduce 函数在一行中执行求和,而不是使用 foreach。

 let array = [ { Daypart: "G_POSTPEAK", day_of_week: "Monday", uplift: 1 }, { Daypart: "A_BREAKFAST", day_of_week: "Thursday", uplift: 1 }, { Daypart: "C_DAYTIME", day_of_week: "Sunday", uplift: 2 }, { Daypart: "G_POSTPEAK", day_of_week: "Monday", uplift: 2 }, ]; const totalUplift = array.reduce((acc, array) => acc + array.uplift, 0); console.log(totalUplift);

您可以使用array#reduce根据对象累加器中的Daypartday_of_week对数据进行分组。

 let data = [ { Daypart: "G_POSTPEAK", day_of_week: "Monday", uplift: 1 }, { Daypart: "A_BREAKFAST", day_of_week: "Thursday", uplift: 1 }, { Daypart: "C_DAYTIME", day_of_week: "Sunday", uplift: 2 }, { Daypart: "G_POSTPEAK", day_of_week: "Monday", uplift: 2 }], result = data.reduce((r,o) => { let key = `${o.Daypart}_${o.day_of_week}`; r[key] = r[key] || {...o, uplift: 0}; r[key].uplift += o.uplift; return r; },{}); console.log(result);
 .as-console-wrapper {max-height: 100% !important; top: 0;}

一个功能性更强的版本,像其他几个解决方案一样使用reduce

 const combine = inputs => Object .values ( inputs .reduce ((a, {Daypart, day_of_week, uplift}) => { const key = `${Daypart}|${day_of_week}` return {...a, [key]: ({ Daypart, day_of_week, uplift: (a[key] && a[key].uplift || 0) + uplift })} }, {}) ) let inputs = [ {Daypart: "G_POSTPEAK", day_of_week: "Monday", uplift: 1}, {Daypart: "A_BREAKFAST", day_of_week: "Thursday", uplift: 1}, {Daypart: "C_DAYTIME", day_of_week: "Sunday", uplift: 2}, {Daypart: "G_POSTPEAK", day_of_week: "Monday", uplift: 2}, ] console .log ( combine (inputs) )

您可以使用 loadash 包以优化的方式执行此操作...

let _ = require('lodash');
let arrays = [
  {
    'name':'monday',
    vaue:1
  },
 {
    'name':'monday',
    vaue:2
 },
 {
    'name':'tuesday',
    vaue:3
 },
 {
   'name':'wednesday',
   vaue:11
 },
 {
   'name':'wednesday',
   vaue:11
 },
]

let newarray = _(arrays).groupBy("name").map(   (name) => ({
   name: name,
   value0: _.sumBy(name, 'vaue')
 }))
 .value()
console.log(newarray);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM