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中。