Javascript 基于现有对象数组的若干属性返回新的对象数组
我正在绞尽脑汁想如何实现我所需要的。我的初始对象数组是70k个对象,每个对象有15个属性。通过过滤和映射,我得到了我认为相关部分的数据集。我需要根据每个对象的4个属性中的每一个返回一个新的对象数组,它们是重复的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
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整数
}).level console.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"));