Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/372.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 遍历对象数组并根据条件添加到其他数组_Javascript_Arrays_Object - Fatal编程技术网

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
)作为数组?使用字典将年份映射到值(因为键必须是唯一的),这将非常容易实现。请参阅。它需要是一个数组