Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/38.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_Node.js - Fatal编程技术网

Javascript 基于属性“最小值”和“最大值”筛选对象数组

Javascript 基于属性“最小值”和“最大值”筛选对象数组,javascript,node.js,Javascript,Node.js,我想根据sales属性的max或min值筛选以下对象数组 data = [ { region: 'Central', state: 'North Dakota', sales: 920 }, { region: 'Central', state: 'South Dakota', sales: 1317 }, { region: 'East', state: 'West Virginia', sales: 1209 }, { region: 'East', state: 'Main

我想根据sales属性的max或min值筛选以下对象数组

data = [
  { region: 'Central', state: 'North Dakota', sales: 920 },
  { region: 'Central', state: 'South Dakota', sales: 1317 },
  { region: 'East', state: 'West Virginia', sales: 1209 },
  { region: 'East', state: 'Maine', sales: 1270 },
  { region: 'South', state: 'South Carolina', sales: 8483 },
  { region: 'South', state: 'Louisiana', sales: 9219 },
  { region: 'West', state: 'Wyoming', sales: 1603 },
  { region: 'West', state: 'Idaho', sales: 4380 },
  { region: 'West', state: 'California', sales: 4571 }
];
根据sales属性的最大值和最小值筛选数组。我正在寻找以下结果:

newData = [
  { region: 'Central', min: 'North Dakota', max: 'South Dakota' },
  { region: 'East', min: 'West Virginia', max: 'Maine' },
  { region: 'South', min: 'South Carolina', max: 'Louisiana' },
  { region: 'West', min: 'Wyoming', max: 'California' }
];

提前感谢。

Ciao,您可以尝试过滤区域数据,然后计算最大值和最小值,并在结果数组中按如下方式推送找到的对象:

让数据=[ {地区:'中部',州:'北达科他州',销售额:920}, {地区:'中部',州:'南达科他州',销售额:1317}, {地区:'东部',州:'西弗吉尼亚',销售额:1209}, {地区:'东部',州:'缅因州',销售额:1270}, {地区:'South',州:'South Carolina',销售额:8483}, {地区:'南部',州:'路易斯安那州',销售:9219}, {地区:'西部',州:'怀俄明州',销售:1603}, {地区:'西部',州:'爱达荷州',销售额:4380}, {地区:'West',州:'California',销售额:4571} ]; let regions=[‘中部’、‘东部’、‘南部’、‘西部’]; 让结果=[]; regions.forEachregion=>{ 让dataFilter=data.filtere=>el.region==region; 让max=Math.max…dataFilter.mapel=>el.sales; 让min=Math.min…dataFilter.mapel=>el.sales; 让dataMax=dataFilter.filterl=>el.sales==max[0]; 让dataMin=dataFilter.filterl=>el.sales==min[0]; 让objresult={region:region,min:dataMin.state,max:dataMax.state}; result.pushobjresult; }
console.logresultCiao,您可以尝试过滤区域数据,然后计算最大值和最小值,并在结果数组中推送找到的对象,如下所示:

让数据=[ {地区:'中部',州:'北达科他州',销售额:920}, {地区:'中部',州:'南达科他州',销售额:1317}, {地区:'东部',州:'西弗吉尼亚',销售额:1209}, {地区:'东部',州:'缅因州',销售额:1270}, {地区:'South',州:'South Carolina',销售额:8483}, {地区:'南部',州:'路易斯安那州',销售:9219}, {地区:'西部',州:'怀俄明州',销售:1603}, {地区:'西部',州:'爱达荷州',销售额:4380}, {地区:'West',州:'California',销售额:4571} ]; let regions=[‘中部’、‘东部’、‘南部’、‘西部’]; 让结果=[]; regions.forEachregion=>{ 让dataFilter=data.filtere=>el.region==region; 让max=Math.max…dataFilter.mapel=>el.sales; 让min=Math.min…dataFilter.mapel=>el.sales; 让dataMax=dataFilter.filterl=>el.sales==max[0]; 让dataMin=dataFilter.filterl=>el.sales==min[0]; 让objresult={region:region,min:dataMin.state,max:dataMax.state}; result.pushobjresult; } logresult您可以按状态分组并获得最小和最大状态

这种方法采用单个循环来收集数据

常数 数据=[{地区:'中部',州:'北达科他州',销售额:920},{地区:'中部',州:'南达科他州',销售额:1317},{地区:'东部',州:'缅因州',销售额:1270},{地区:'南部',州:'南卡罗来纳州',销售额:8483},{地区:'南部',州:'路易斯安那州',销售额:9219},{地区:'West',州:'Wyoming',销售额:1603},{地区:'West',州:'Idaho',销售额:4380},{地区:'West',州:'California',销售额:4571}, 结果=对象 .entriesdata.reducer,{地区、州、销售}=>{ if!r[区域]{ r[地区]={min:{state,sales},max:{state,sales}; }如果r[region].min.sales>sales,则为else{ r[地区].min.sales=sales; r[region].min.state=state; }如果r[region].max.sales{region,min,max}; console.logresult; .作为控制台包装器{max height:100%!important;top:0;}您可以按状态分组并获得最小和最大状态

这种方法采用单个循环来收集数据

常数 数据=[{地区:'中部',州:'北达科他州',销售额:920},{地区:'中部',州:'南达科他州',销售额:1317},{地区:'东部',州:'缅因州',销售额:1270},{地区:'南部',州:'南卡罗来纳州',销售额:8483},{地区:'南部',州:'路易斯安那州',销售额:9219},{地区:'West',州:'Wyoming',销售额:1603},{地区:'West',州:'Idaho',销售额:4380},{地区:'West',州:'California',销售额:4571}, 结果=对象 .entriesdata.reducer,{地区、州、销售}=>{ if!r[区域]{ r[地区]={min:{state,sales},max:{state,sales}; }如果r[region].min.sales>sales,则为else{ r[地区].min.sales=sales; r[region].min.state=state; }如果r[region].max.sales{region,min,max}; console.logresult;
.作为控制台包装器{max height:100%!important;top:0;}您可以使用一个令人讨厌的oneliner样式:

让数据=[ {地区:'中部',州:'北达科他州',销售额:920}, {地区:'中部',州:'南达科他州',销售额:1317}, {地区:'东部',州:'西弗吉尼亚',销售额:1209}, {地区:'东部',州:'缅因州',销售额:1270}, {地区:'South',州:'South Carolina',销售额:8483}, {地区:'南部',州:'路易斯安那州',销售:9219}, {地区:'西部',州:'怀俄明州',销售:1603}, {地区:'西部',州:'爱达荷州',销售额:4380}, {地区:'West',州:'California',销售额:4571} ]; 让newData=Array.fromnew Setdata.mapitem=>item.region .mapregion=>{ 地区:地区,, min:data.filteritem=>item.region==region.reduceAc,cur=>cur.salesitem.region==region.reduceacc,cur=>cur.sales>acc.sales?cur:acc,{sales:-Infinity}.state };
console.lognewData 下面是一个你可以使用的令人讨厌的单行模式:

让数据=[ {地区:'中部',州:'北达科他州',销售额:920}, {地区:'中部',州:'南达科他州',销售额:1317}, {地区:'东部',州:'西弗吉尼亚',销售额:1209}, {地区:'东部',州:'缅因州',销售额:1270}, {地区:'South',州:'South Carolina',销售额:8483}, {地区:'南部',州:'路易斯安那州',销售:9219}, {地区:'西部',州:'怀俄明州',销售:1603}, {地区:'西部',州:'爱达荷州',销售额:4380}, {地区:'West',州:'California',销售额:4571} ]; 让newData=Array.fromnew Setdata.mapitem=>item.region .mapregion=>{ 地区:地区,, min:data.filteritem=>item.region==region.reduceAc,cur=>cur.salesitem.region==region.reduceacc,cur=>cur.sales>acc.sales?cur:acc,{sales:-Infinity}.state };
console.lognewData 您可以使用reduce并创建一个以region作为代码的对象。然后将值添加到该键,同时添加对当前对象的最大值和最小值的检查。在销售大于或小于最大值和最小值时,则替换对象数据

数据=[{ 地区:'中部', 州:“北达科他州”, 销售额:920 }, { 地区:'中部', 州:“南达科他州”, 销售:1317 }, { 地区:'东', 州:“西弗吉尼亚州”, 销售:1209 }, { 地区:'东', 州:“缅因州”, 销售额:1270 }, { 地区:'南', 州:“南卡罗来纳州”, 销售:8483 }, { 地区:'南', 州:“路易斯安那州”, 销售:9219 }, { 地区:'西部', 州:“怀俄明州”, 销售额:1603 }, { 地区:'西部', 州:“爱达荷州”, 销售:4380 }, { 地区:'西部', 州:'加利福尼亚', 销售:4571 } ]; 让newData=data.reduceac,curr=>{ //检查累加器对象中是否有与区域代码相同的密钥。 如果!根据[当前区域]{ //创建一个键并添加值,maxVal和minVal将用于比较销售额 会计科目[当前地区]={ 地区:当前地区, min:当前状态, 麦克斯:现在的状态, 马克斯瓦尔:货币销售, 米瓦尔:现钞销售 } } 如果curr.sales>acc[curr.region].maxVal{ acc[当前区域].max=当前状态; acc[curr.region].maxVal=curr.sales; } 如果当前销售console.logObject.valuesnewData您可以使用reduce并创建一个以region作为代码的对象。然后将值添加到该键,同时添加对当前对象的最大值和最小值的检查。在销售大于或小于最大值和最小值时,则替换对象数据

数据=[{ 地区:'中部', 州:“北达科他州”, 销售额:920 }, { 地区:'中部', 州:“南达科他州”, 销售:1317 }, { 地区:'东', 州:“西弗吉尼亚州”, 销售:1209 }, { 地区:'东', 州:“缅因州”, 销售额:1270 }, { 地区:'南', 州:“南卡罗来纳州”, 销售:8483 }, { 地区:'南', 州:“路易斯安那州”, 销售:9219 }, { 地区:'西部', 州:“怀俄明州”, 销售额:1603 }, { 地区:'西部', 州:“爱达荷州”, 销售:4380 }, { 地区:'西部', 州:'加利福尼亚', 销售:4571 } ]; 让newData=data.reduceac,curr=>{ //检查累加器对象中是否有与区域代码相同的密钥。 如果!根据[当前区域]{ //创建一个键并添加值,maxVal和minVal将用于比较销售额 会计科目[当前地区]={ 地区:当前地区, min:当前状态, 麦克斯:现在的状态, 马克斯瓦尔:货币销售, 米瓦尔:现钞销售 } } 如果curr.sales>acc[curr.region].maxVal{ acc[当前区域].max=当前状态; acc[curr.region].maxVal=curr.sales; } 如果当前销售console.logObject.valuesnewdata欢迎使用SO!到目前为止你尝试了什么?欢迎来到so!“到目前为止你尝试了什么?”NinaScholz当我看到你的解决方案时,我总是想:为什么我没有想到这一点?但后来我更好地阅读了你的代码,我开始思考另一件事:为什么我不理解她写的东西不管怎样,我想说的是,在算法方面,你是优秀的,这不是我第一次问你为什么不问问,你不懂什么?@NinaScholz今天我明白了你做了什么,花了10分钟才明白,但我明白了:。但我保证下次我不明白的时候我会问你。不管怎样,今天也是。。。带地图的减速器。。。你是怎么想的?您制定了一个中间解决方案,然后进行了优化,或者您就是这样编写的?只是想看看问题,第一个是按区域分组,这是使用O1访问的最佳选择,由对象或地图提供。第二个是保持最小值和最大值。第二步只是改变结果的外观。@NinaScholz当我看到你的解决方案时,我总是想:为什么我没有想到这个?但后来我更好地阅读了你的代码,我开始思考另一件事:为什么我不理解她写的东西不管怎样,我想说的是,在算法方面,你是优秀的,这不是我第一次问你为什么不问问,你不懂什么?@NinaScholz今天我明白了你做了什么,花了10分钟才明白,但我明白了:。但我保证下次我不明白的时候我会问你。不管怎样,今天也是。。。带地图的减速器。。。你是怎么想的?您制定了一个中间解决方案,然后进行了优化,或者您就是这样编写的?只是想看看问题,第一个是按区域分组,这是使用O1访问的最佳选择,由对象或地图提供。第二个是保持最小值和最大值。第二步只是更改结果的外观。
newData = [];

for(let i=0; i<data.length; i++){
  const matchedRegion = newData.findIndex((e) => e.region === data[i].region);
  if(matchedRegion !== -1){
    const min = data.find((f) => f.state === newData[matchedRegion].min).sales;
    const max = data.find((f) => f.state === newData[matchedRegion].max).sales;
    if(data[i].sales < min){
      newData[matchedRegion].min = data[i].state;
    } else if(data[i].sales > max){
      newData[matchedRegion].max = data[i].state;
    }
  } else {
    newData.push({region: data[i].region, min: data[i].state, max: data[i].state});
  }
}