Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.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_Immutability - Fatal编程技术网

Javascript-尝试将数据不可变地添加到映射中的数组,但接收到空数组

Javascript-尝试将数据不可变地添加到映射中的数组,但接收到空数组,javascript,arrays,immutability,Javascript,Arrays,Immutability,我有一个函数,我试图通过一个对象数组进行映射。对于数组中的每个项目,我想计算某些平均值,然后将这些数据放入不同的数组中。在函数的末尾,我想返回现在包含映射期间接收的数据的数组 相反,我得到的是一个空数组 我试图在不改变数组的情况下这样做,因此避免了array.push()(我会注意到,如果我在函数中使用array.push来更新数组,函数就会工作) 下面是有问题的函数: 函数getForecastAverages(预测){ const dailyForecast=对象值(预测); 常数平均值=[

我有一个函数,我试图通过一个对象数组进行映射。对于数组中的每个项目,我想计算某些平均值,然后将这些数据放入不同的数组中。在函数的末尾,我想返回现在包含映射期间接收的数据的数组

相反,我得到的是一个空数组

我试图在不改变数组的情况下这样做,因此避免了array.push()(我会注意到,如果我在函数中使用array.push来更新数组,函数就会工作)

下面是有问题的函数:

函数getForecastAverages(预测){
const dailyForecast=对象值(预测);
常数平均值=[];
DailyForecast.map((小时预测,idx)=>{
const high=getTempAvg(hourlyforecast,“high”);
const low=getTempAvg(hourlyforecast,“low”);
const desc=getDescriptionAvg(小时预测);
返回[…平均值,{date:Object.keys(forecast)[idx],高,低,desc}];
});
平均回报率;
}
其他职能

函数getTempAvg(预测,键){
const avg=forecast.reduce((acc,curr)=>acc+curr[key],0)/forecast.length;
返回平均固定时间(2);
}
函数getDescriptionAvg(预测){
const length=0.length;
const description=forecast.map(forecast=>forecast.description);
返回getMostFrequent(描述,长度,0);
}
函数getMostFrequent(数组,长度,currIdx,maxCount=0,mostFrequent=null,counts={}){
if(currIdx+1>长度)返回mostfreent;
//首先,我们需要计算数组中的频率的单词
常量字=数组[currIdx];
//检查counts对象中是否存在当前单词。如果不存在,则将单词及其计数添加到该对象中。如果存在,则将其当前计数增加1
如果(计数[字]==未定义){
计数[字]=1;
}否则{
计数[字]=计数[字]+1;
}
//检查当前单词的计数是否大于对象中的最高计数。如果大于,我们要更新最大计数和最频繁的单词
如果(计数[字]>最大计数){
最大计数=计数[字];
mostFrequent=单词;
}
常数newIdx=currIdx+1;
返回getMostFrequent(数组、长度、newIdx、maxCount、mostFrequent、计数);
}
虚拟数据

forecasts = {
  '2019-07-25': [
    {
      date: '2019-07-25 18:00:00',
      description: 'broken clouds',
      grnd_level: 1006.19,
      high: 24.64,
      humidity: 49,
      low: 23.98,
      pressure: 1017.03,
      sea_level: 1017.03,
      temp: 24.64,
    },
    {
      date: '2019-07-25 21:00:00',
      description: 'overcast clouds',
      grnd_level: 1006.34,
      high: 22.91,
      humidity: 55,
      low: 22.41,
      pressure: 1017.16,
      sea_level: 1017.16,
      temp: 22.91,
    },
  ],
  '2019-07-26': [
    {
      date: '2019-07-26 18:00:00',
      description: 'broken clouds',
      grnd_level: 1006.19,
      high: 24.64,
      humidity: 49,
      low: 23.98,
      pressure: 1017.03,
      sea_level: 1017.03,
      temp: 24.64,
    },
    {
      date: '2019-07-26 21:00:00',
      description: 'overcast clouds',
      grnd_level: 1006.34,
      high: 22.91,
      humidity: 55,
      low: 22.41,
      pressure: 1017.16,
      sea_level: 1017.16,
      temp: 22.91,
    },
  ],
}
我也试过

returnaverages.concat({date:Object.keys(forecast)[idx],high,low,desc})
接收到“平均值”为只读且无法更改的错误

const oldAvgs=平均值
平均值=[…oldAvgs,{date:Object.keys(forecast)[idx],高,低,desc}]
平均回报率
但就像我说的,它改变了数组

returnaverages.push({date:Object.keys(forecast)[idx],high,low,desc})

您需要返回映射的对象

函数getForecastAverages(预测){
const dailyForecast=对象值(预测);
const dailyForecastKeys=Object.keys(预测);
const averages=每日预测.map((小时预测,idx)=>{
const high=getTempAvg(hourlyforecast,“high”);
const low=getTempAvg(hourlyforecast,“low”);
const desc=getDescriptionAvg(小时预测);
返回{date:dailyForecastKeys[idx],高,低,描述};
});
平均回报率;
}
Javascript数组方法返回一个新数组,您需要将代码稍微更改如下:

function getForecastAverages(forecasts) {
  const dailyForecasts = Object.values(forecasts);
  const averages = dailyForecasts.map((hourlyForecasts, idx) => {
    const high = getTempAvg(hourlyForecasts, 'high');
    const low = getTempAvg(hourlyForecasts, 'low');
    const desc = getDescriptionAvg(hourlyForecasts);
    const average = { date: Object.keys(forecasts)[idx], high, low, desc };
    return average;
  });

  return averages;
}

分配
平均值
地图的结果,而不是放弃计算(如hi/low)@dandavis你100%正确。手到额头的时刻。感谢并感谢您提供有关
dailyForecastKeys
变量的重构提示