Javascript 如何添加数组的对象属性并对其进行更新?

Javascript 如何添加数组的对象属性并对其进行更新?,javascript,arrays,Javascript,Arrays,我有一个对象数组,我想通过添加月份来更新总价值 var arrObj=[ {name:"ABC",Jan:0,Feb:20,Mar:30,Apr:40,May:50,Jun:70,Jul:80,Aug:90,Sep:100,Oct:110,Nov:120,Dec:130,Total:0}, {name:"BCD",Jan:10,Feb:20,Mar:30,Apr:40,May:50,Jun:70,Jul:80,Aug:90,Sep:100,Oct:110,Nov:120,Dec:13

我有一个对象数组,我想通过添加月份来更新总价值

var arrObj=[
  {name:"ABC",Jan:0,Feb:20,Mar:30,Apr:40,May:50,Jun:70,Jul:80,Aug:90,Sep:100,Oct:110,Nov:120,Dec:130,Total:0},
    {name:"BCD",Jan:10,Feb:20,Mar:30,Apr:40,May:50,Jun:70,Jul:80,Aug:90,Sep:100,Oct:110,Nov:120,Dec:130,Total:0},
   {name:"DEF",Jan:10,Feb:20,Mar:30,Apr:40,May:50,Jun:70,Jul:80,Aug:90,Sep:100,Oct:110,Nov:120,Dec:130,Total:0},
   {name:"FGH",Jan:10,Feb:20,Mar:30,Apr:40,May:50,Jun:70,Jul:80,Aug:90,Sep:100,Oct:110,Nov:120,Dec:130,Total:0}
]
我正在使用循环更新值,它也在工作,但有没有最好的方法来实现这一点

var len=arrObj.length;
var Total=0;
for(var i=0;i<len;i++){
arrObj[i].Total= +arrObj[i].Jan + +arrObj[i].Feb + +arrObj[i].Mar+ +arrObj[i].Apr+ +arrObj[i].May+ +arrObj[i].Jun+ +arrObj[i].Jul+ +arrObj[i].Aug+ +arrObj[i].Sep+ +arrObj[i].Oct+ +arrObj[i].Nov+ +arrObj[i].Dec;
}
console.log(arrObj)
瓦阿罗布=[ {姓名:ABC,一月:0,二月:20,三月:30,四月:40,五月:50,六月:70,七月:80,八月:90,九月:100,十月:110,十一月:120,十二月:130,总计:0}, {姓名:BCD,1月10日,2月20日,3月30日,4月40日,5月50日,6月70日,7月80日,8月90日,9月100日,10月110日,11月120日,12月130日,总计:0}, {姓名:DEF,一月:10,二月:20,三月:30,四月:40,五月:50,六月:70,七月:80,八月:90,九月:100,十月:110,十一月:120,十二月:130,总计:0}, {姓名:FGH,一月:10日,二月:20日,三月:30日,四月:40日,五月:50日,六月:70日,七月:80日,八月:90日,九月:100日,十月:110日,十一月:120日,十二月:130日,总计:0} ] var len=arrObj.length; var合计=0;
forvar i=0;我我会做下面这样的事情

循环遍历数组元素 过滤掉不需要的钥匙 减少剩余的关键点以获得总数 arrObj.forEachelement=>{ element.Total=Object.keyselement。 filterkey=>key!==name&&key!==Total。 reduceAC,key=>acc+元素[key],0 }
可以使用循环并排除字段name和Total。但这将更难阅读

瓦阿罗布=[ {姓名:ABC,一月:0,二月:20,三月:30,四月:40,五月:50,六月:70,七月:80,八月:90,九月:100,十月:110,十一月:120,十二月:130,总计:0}, {姓名:BCD,1月10日,2月20日,3月30日,4月40日,5月50日,6月70日,7月80日,8月90日,9月100日,10月110日,11月120日,12月130日,总计:0}, {姓名:DEF,一月:10,二月:20,三月:30,四月:40,五月:50,六月:70,七月:80,八月:90,九月:100,十月:110,十一月:120,十二月:130,总计:0}, {姓名:FGH,一月:10日,二月:20日,三月:30日,四月:40日,五月:50日,六月:70日,七月:80日,八月:90日,九月:100日,十月:110日,十一月:120日,十二月:130日,总计:0} ] 阿罗布一世{ forlet eli在arrObj[i]{ ifeli!=总计和&eli!=名称{ arrObj[i].总计+=arrObj[i][eli]; } } } console.logarrObj 可以使用reduce方法进行此操作:


您可以定义一个函数,该函数从每个对象获取总计

const getTotal = obj => {
    let total = 0;
    const months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
    months.forEach(month => total += obj[month]);
    return total;
}
然后像这样使用它

arrObj.forEach(obj => obj.total = getTotal(obj));
可以定义一个对象的getter属性,其中根据所依赖的属性的每次更改计算总数

在es6中,可以使用类和获取属性来实现这一点

 Class MonthTotal {
    public Jan;
    public Feb;
    public MonthTotal(data) {
       this.Jan = data.Jan;
       this.Feb = data.Feb;
    }
    get Total() {
      return this.Jan + this.Feb;
    }
 }
 const monthData = new MonthTotal({ Jan: 10, Feb: 20});
 console.log(monthData.total); // logs :: 30
在es5中,我们可以利用一个简单的函数getter属性调用

var monthData = { 
  name:"ABC",
  Jan:0,
  Feb:20,
  Mar:30
  get total() {
    return this.Jan + this.Feb + this.Mar;
  }
}

console.log(monthData.total); // logs :: 30

我假设你是编程新手,我也假设你对数据结构有完全的控制权,所以如果你已经知道这一点,我道歉

有一个概念叫做。这有一些规则,但对于初学者来说,最重要的是理解数据的含义。在这种情况下,您是完整地保存或更改数据,还是仅从中读取数据

对于总计,您不直接与它交互,它应该是对其他值的计算,而更改它的唯一方法是更改其他值

在JavaScript中,有解决这个问题的方法

看起来像这样

{
  get Total () {
    return ...calculation
  }
}
常量对象={ 价值:3, 获取双倍值{ 返回这个值*2 } } obj.doubleValue//6 在你的情况下,你可以有这样的东西

{
  get Total () {
    return ...calculation
  }
}
下面是一个工作示例

{
  name:"ABC",
  Jan:0,
  Feb:20,
  Mar:30,
  Apr:40,
  May:50,
  Jun:70,
  Jul:80,
  Aug:90,
  Sep:100,
  Oct:110,
  Nov:120,
  Dec:130,
  get Total () {
    const keys = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
    let sum = 0;
    keys.forEach((key) => {
      sum += this[key]
    })
    return sum
  }
}

因此,如果您更改任何一个值,则调用Total将自动更新。

我喜欢这种声明性方法,比循环并排除不相关的字段要好得多。假设它添加了任何可以解析为浮点的属性都是很好的,除非您第二次运行它。@JasonHarwig感谢您的评论。很抱歉,你能告诉我第二次循环的位置吗?你不在这个例子中,但是如果你把它提取到一个函数中,它就不是幂等的,除非它忽略了total,否则它会在第二次将total加到sum中。