Javascript 基于现有对象数组的若干属性返回新的对象数组

Javascript 基于现有对象数组的若干属性返回新的对象数组,javascript,arrays,algorithm,object,Javascript,Arrays,Algorithm,Object,我正在绞尽脑汁想如何实现我所需要的。我的初始对象数组是70k个对象,每个对象有15个属性。通过过滤和映射,我得到了我认为相关部分的数据集。我需要根据每个对象的4个属性中的每一个返回一个新的对象数组,它们是重复的id,并且每个code具有不同的级别。我的过滤数据看起来是这样的 const arr = [{id: "12345", level: "1", current: "Y", code: "1"}, {id: "12345", level: "0", current

我正在绞尽脑汁想如何实现我所需要的。我的初始对象数组是70k个对象,每个对象有15个属性。通过过滤和映射,我得到了我认为相关部分的数据集。我需要根据每个对象的4个属性中的每一个返回一个新的对象数组,它们是重复的
id
,并且每个
code
具有不同的
级别。我的过滤数据看起来是这样的

const arr = [{id: "12345", level: "1", current: "Y", code: "1"}, 
             {id: "12345", level: "0", current: "N", code: "1"},
             {id: "54321", level: "1", current: "N", code: "201"},
             {id: "54321", level: "2", current: "Y", code: "201"}, 
             {id: "54321", level: "3", current: "N", code: "201"},
             {id: "54321", level: "0", current: "Y", code: "401"},
             {id: "54321", level: "1", current: "N", code: "401"},
             {id: "54321", level: "3", current: "N", code: "201"},
             {id: "54321", level: "0", current: "N", code: "301"},
             {id: "121212", level: "0", current: "N", code: "3"},
             {id: "121212", level: "1", current: "N", code: "3"}]
我需要实现的是,对于每个
id
对于任何
当前
Y
对于每个
代码
,我需要找到该
代码
的最大
级别。因此,对于上面的示例,结果输出将是如下所示的对象数组:

const result = [{id: "12345", max: "1", code: "1"}, 
                {id: "54321", max: "3", code: "201"},
                {id: "54321", max: "1", code: "401"}]
我甚至不确定我想要的是可能的,还是我想的不对。我整个上午都在绞尽脑汁想办法。

你可以使用
.filter()
.map()
根据
Y
获得初始值,然后使用
.reduce()
获得最大值:

const arr=[{id:“12345”,级别:“1”,当前“Y”,代码:“1”},
{id:“12345”,级别:“0”,当前“N”,代码:“1”},
{id:“54321”,级别:“1”,当前“N”,代码:“201”},
{id:“54321”,级别:“2”,当前“Y”,代码:“201”},
{id:“54321”,级别:“3”,当前“N”,代码:“201”},
{id:“54321”,级别:“0”,当前“Y”,代码:“401”},
{id:“54321”,级别:“1”,当前“N”,代码:“401”},
{id:“54321”,级别:“3”,当前“N”,代码:“201”},
{id:“54321”,级别:“0”,当前“N”,代码:“301”},
{id:“121212”,级别:“0”,当前“N”,代码:“3”},
{id:“121212”,级别:“1”,当前“N”,代码:“3”}]
让initialValues=arr.filter(x=>x.current==“Y”)
.map(x=>({id:x.id,max:x.level,code:x.code}));
让结果=arr.reduce((结果,当前)=>{
var value=result.find(x=>x.id==current.id&&x.code==current.code);
如果(!value)返回结果;
如果(最大值<当前水平){
value.max=当前的.level;
}
返回结果;
},初始值);
控制台日志(结果)
constresultobject=(arr,filter)=>arr.reduce((总和,元素)=>{
const currentInSum=sum[element.id];
常量filtersatified=element.current==filter;
const isHighestLevel=!currentInSum | | currentInSum.level
基本上,您希望使用一个对象,以便检查元素是否已添加,如果当前级别高于已添加的级别,则替换它,如果这是第一次出现,则仅将其添加到对象中

最后,只需从对象获取所有值以将其转换为数组,您不需要关心对象id的键


该算法需要O(n*2)个时间来执行,因为您必须运行一次arr,然后必须将对象中的所有值转换为一个数组

您只需实现一个
数组。reduce()
对象分解
。用
id
code
组合的每个键构建地图。只需在地图上使用
Object.values()
,即可获得所需的结果:

const arr=[{id:“12345”,level:“1”,current:“Y”,code:“1”},{id:“12345”,level:“0”,current:“N”,code:“1”,current:“N”,code:“201”},current:“Y”,code:“201”},{id:“54321”,level:“3”,current:“N”,code:“201”},{id:“54321”,level:“0”,current:“Y”,code:“401”},id:“54321”,级别:“1”,当前:“N”,代码:“401”},{id:“54321”,级别:“3”,当前:“N”,代码:“201”},{id:“54321”,级别:“0”,当前:“N”,代码:“301”},{id:“121212”,级别:“0”,当前:“N”,代码:“3”},{id:“121212”,级别:“1”,当前:“N”,代码:“3”};
const result=Object.values(arr.reduce((a,{level,current,…props})=>{
a[props.id+“”+props.code]=a[props.id+“”+props.code]| props;
a[props.id+“”+props.code].max=Math.max((a[props.id+“”+props.code].max | | 0),级别);
返回a;
},{}));

console.log(result);
您可以简化为映射并获取其值

const arr=[{id:“12345”,级别:“1”,当前“Y”,代码:“1”},
{id:“12345”,级别:“0”,当前“N”,代码:“1”},
{id:“54321”,级别:“1”,当前“N”,代码:“201”},
{id:“54321”,级别:“2”,当前“Y”,代码:“201”},
{id:“54321”,级别:“3”,当前“N”,代码:“201”},
{id:“54321”,级别:“0”,当前“Y”,代码:“401”},
{id:“54321”,级别:“1”,当前“N”,代码:“401”},
{id:“54321”,级别:“3”,当前“N”,代码:“201”},
{id:“54321”,级别:“0”,当前“N”,代码:“301”},
{id:“121212”,级别:“0”,当前“N”,代码:“3”},
{id:“121212”,级别:“1”,当前“N”,代码:“3”}];
常数res=arr.reduce((a,b)=>
b、 当前=='Y'?
a、 设置(b.id+b.code)(a.get(b.id+b.code)|{
级别:Number.MIN\u安全\u整数
}).levelconsole.log([…res.values()]);
if“用于Y的任何当前值“那么,最大值不应该是1,0,2而不是1,3,1吗?@mickl我可能用词不对,但是对于任何
code
每个
id
都有一个“Y”的代码,我需要找到
id
的最大值。我需要最高
级别
,每个代码都有一个“Y”谢谢,修改了我的答案,现在它会返回你需要的结果。OP期待不同的结果,就像一个符咒。非常感谢。
const resultObject = (arr, filter) => arr.reduce((sum, element) => {
  const currentInSum = sum[element.id];
  const filterSatisfied = element.current === filter;
  const isHighestLevel = !currentInSum  || currentInSum.level < element.level;
  if(filterSatisfied && isHighestLevel){
     sum[element.id] = element;
  }
  return sum;
}, {});
const result = Object.values(resultObject(arr, "Y"));