Javascript 遍历对象数组并根据条件添加到其他数组
我有一个包含以下对象的数组Javascript 遍历对象数组并根据条件添加到其他数组,javascript,arrays,object,Javascript,Arrays,Object,我有一个包含以下对象的数组 var notTotal = [{"Year":2012,"Value":800579}, {"Year":2012,"Value":654090}, {"Year":2012,"Value":758092}, {"Year":2013,"Value":343928},...More objects.. ] 我要做的是遍历这个只存在一年而不是多年的对象数组,并将该年的值相
var notTotal = [{"Year":2012,"Value":800579},
{"Year":2012,"Value":654090},
{"Year":2012,"Value":758092},
{"Year":2013,"Value":343928},...More objects.. ]
我要做的是遍历这个只存在一年而不是多年的对象数组,并将该年的值相加。使用上面的例子
var total = [{"Year":2012,"Value":2556689},
//Total of first three 2012 assuming there isnt anymore 2012 in the array
{"Year":2013,"Value":343928},...]
我尝试过以下方法:
for(var i = 0; i < notTotal.length; i++) {
if (total.includes(notTotal[i].Year || notTotal[i])) {
//Add the value of the year in notTotal array to the same year in total array
} else {
total.push(notTotal[i]); //add year and value if it does not exist to the total array
}
}
for(变量i=0;i
如果这是一个重复的道歉。这似乎是一个相当具体的问题
谢谢 您可以构建一个哈希表:
var hash = {},total=[];
for(const {Year,Value} of notTotal){
if(hash[Year]){
hash[Year].Value+=Value;
}else{
total.push(hash[Year]={Year,Value});
}
}
注意:对象属性通常不大写…您可以构建一个哈希表:
var hash = {},total=[];
for(const {Year,Value} of notTotal){
if(hash[Year]){
hash[Year].Value+=Value;
}else{
total.push(hash[Year]={Year,Value});
}
}
注意:对象属性通常不大写…一个简单的解决方案是创建一个对象,按年份保存总数
var totalByYear = {};
然后,您可以使用notTotal.forEach
或for
循环遍历数组,如图所示,将totalByYear
对象中相关年份的值相加
notTotal.forEach(function(ele) { totalByYear[ele.Year] += ele.Value });
这将生成一个具有年份键和总值的对象,例如,使用您的示例:
{'2012': 2556689, '2013': 343928 /* other years */}
然后可以从totalByYear
对象(以及按年份打印的总计)构建所需的格式(用于D3
):
然后,
总计
数组将具有所需的格式。一个简单的解决方案是创建一个对象,按年份保存总计
var totalByYear = {};
然后,您可以使用notTotal.forEach
或for
循环遍历数组,如图所示,将totalByYear
对象中相关年份的值相加
notTotal.forEach(function(ele) { totalByYear[ele.Year] += ele.Value });
这将生成一个具有年份键和总值的对象,例如,使用您的示例:
{'2012': 2556689, '2013': 343928 /* other years */}
然后可以从totalByYear
对象(以及按年份打印的总计)构建所需的格式(用于D3
):
然后,
总计
数组将具有所需的格式。好问题!要解释您的if(total.includes(notTotal[i].Year | | notTotal[i])
中发生了什么,您正在查看您的total
数组,或者只查看年份,或者只查看现有的notTotal[i]
。因此,您的循环正试图找到一个值,该值正好是2012
或者正好是“年”:2012,“值”:2556689
。因此,如果您的total
数组如下所示:
[{"Year":2012, "Value": 12345}]
您的for循环将找不到它,即使有一个对象的年份为2012
。至于如何解决这个问题,请看一下前面的问题
希望这有帮助:)好问题!要解释您的
if(total.includes(notTotal[i].Year | | notTotal[i])
中发生了什么,您正在查看您的total
数组,或者只查看年份,或者只查看现有的notTotal[i]
。因此,您的循环正试图找到一个值,该值正好是2012
或者正好是“年”:2012,“值”:2556689
。因此,如果您的total
数组如下所示:
[{"Year":2012, "Value": 12345}]
您的for循环将找不到它,即使有一个对象的年份为2012
。至于如何解决这个问题,请看一下前面的问题
希望这会有所帮助:)您可以使用哈希表检查年份是否不存在,然后生成新的结果集。然后更新总计数
var values=[{年份:2012,值:800579},{年份:2012,值:654090},{年份:2012,值:758092},{年份:2013,值:343928}],
hash=Object.create(null),
总数=[];
值。forEach(函数(o){
hash[o.Year]| | totals.push(hash[o.Year]={Year:o.Year,Value:0});
散列[o.Year].Value+=o.Value;
});
控制台日志(总计)代码>您可以使用哈希表检查年份是否不存在,然后生成新的结果集。然后更新总计数
var values=[{年份:2012,值:800579},{年份:2012,值:654090},{年份:2012,值:758092},{年份:2013,值:343928}],
hash=Object.create(null),
总数=[];
值。forEach(函数(o){
hash[o.Year]| | totals.push(hash[o.Year]={Year:o.Year,Value:0});
散列[o.Year].Value+=o.Value;
});
控制台日志(总计)代码>
var notTotal=[{“年”:2012,“值”:800579},
{“年份”:2012,“价值”:654090},
{“年份”:2012,“价值”:758092},
{“年份”:2013,“价值”:343928}]
var totalObj=notTotal.reduce((总和,obj)=>{
总和[目标年]=总和[目标年]+目标值| |目标值;
回报金额;
}, {});
//将总计转换为所需的格式;
var total=Object.entries(totalObj.map)([Year,Value])=>({Year,Value}))
控制台日志(总计)代码>
var notTotal=[{“年”:2012,“值”:800579},
{“年份”:2012,“价值”:654090},
{“年份”:2012,“价值”:758092},
{“年份”:2013,“价值”:343928}]
var totalObj=notTotal.reduce((总和,obj)=>{
总和[目标年]=总和[目标年]+目标值| |目标值;
回报金额;
}, {});
//将总计转换为所需的格式;
var total=Object.entries(totalObj.map)([Year,Value])=>({Year,Value}))
控制台日志(总计)代码>还有一个解决方案:
function yearlyValueFilter(array){
var yearlyValue = {}
array.forEach( (obj) => { //litterate on the input
var year = obj.Year
var value = obj.Value
if((year in yearlyValue)){ //if the array with not duplicated years conatins the litteration year just plus that value
yearlyValue[year] += value
}else{ //if not conatins, it gets as a basic value
yearlyValue[year] = value
}
})
return yearlyValue
}
还有一个解决方案:
function yearlyValueFilter(array){
var yearlyValue = {}
array.forEach( (obj) => { //litterate on the input
var year = obj.Year
var value = obj.Value
if((year in yearlyValue)){ //if the array with not duplicated years conatins the litteration year just plus that value
yearlyValue[year] += value
}else{ //if not conatins, it gets as a basic value
yearlyValue[year] = value
}
})
return yearlyValue
}
是否需要最终结果(total
)作为数组?使用字典将年份映射到值(因为键必须是唯一的),这将非常容易实现。请参阅。它需要是一个数组,因为我将它插入D3条形图布局之后。可能的重复项是否需要最终结果(total
)作为数组?使用字典将年份映射到值(因为键必须是唯一的),这将非常容易实现。请参阅。它需要是一个数组