在Javascript中将值转换为对象数组的键

在Javascript中将值转换为对象数组的键,javascript,Javascript,假设我有一个对象数组,如下所示: [{name: John, year: 2011, age: "65+", value: 2}, {name: John, year: 2012, age: "65+", value: 5}, {name: Bob, year: 2011, age: "18 under", value: 2}] 我想将此对象数组转换为以下内容: [{name: John, age: "65+", 2011: 2, 2012: 5}, {name: Bob, age: "18

假设我有一个对象数组,如下所示:

[{name: John, year: 2011, age: "65+", value: 2},
{name: John, year: 2012, age: "65+", value: 5},
{name: Bob, year: 2011, age: "18 under", value: 2}]
我想将此对象数组转换为以下内容:

[{name: John, age: "65+", 2011: 2, 2012: 5},
{name: Bob, age: "18 under", 2011: 2, 2012: NA}]

您会注意到,我已将年份值转换为实际键。如何有效地进行此操作?

您可以对数据进行分组,收集所有密钥,并在以后应用缺失的年份

var data=[{name:'John',年份:2011,年龄:“65+”,值:2},{name:'John',年份:2012,年龄:“65+”,值:5},{name:'Bob',年份:2011,年龄:“18岁以下”,值:2}],
年份=新设置;
结果=对象
.values(data.reduce((r,{name,year,value,…o})=>{
r[name]=r[name]|{name,…o};
r[名称][年份]=价值;
年。加上(年);
返回r;
}, {}))
.地图(
(y=>o=>({…y,…o}))
(Object.fromEntries([…years].map(y=>[y,NaN]))
);
控制台日志(结果)

。作为控制台包装{max height:100%!important;top:0;}
您可以对数据进行分组,收集所有密钥,然后应用丢失的年份

var data=[{name:'John',年份:2011,年龄:“65+”,值:2},{name:'John',年份:2012,年龄:“65+”,值:5},{name:'Bob',年份:2011,年龄:“18岁以下”,值:2}],
年份=新设置;
结果=对象
.values(data.reduce((r,{name,year,value,…o})=>{
r[name]=r[name]|{name,…o};
r[名称][年份]=价值;
年。加上(年);
返回r;
}, {}))
.地图(
(y=>o=>({…y,…o}))
(Object.fromEntries([…years].map(y=>[y,NaN]))
);
控制台日志(结果)

.as console wrapper{max height:100%!important;top:0;}
您可以通过每次处理一个数组元素并在每次看到新名称时创建一个新对象来完成此操作:

函数*groupByName(条目){
设group=null;
for(条目的常量{名称、年份、值}){
if(group==null | | group.name!==name){
如果(组!==null){
产量组;
}
组={name};
}
组[年]=价值;
}
如果(组!==null){
产量组;
}
}
常量条目=[
{名称:'John',年份:2011,价值:2},
{名称:'John',年份:2012,价值:5},
{名称:'Bob',年份:2011,值:2},
];

log([…groupByName(条目)])您可以通过一次处理一个数组元素并在每次看到新名称时创建一个新对象来完成此操作:

函数*groupByName(条目){
设group=null;
for(条目的常量{名称、年份、值}){
if(group==null | | group.name!==name){
如果(组!==null){
产量组;
}
组={name};
}
组[年]=价值;
}
如果(组!==null){
产量组;
}
}
常量条目=[
{名称:'John',年份:2011,价值:2},
{名称:'John',年份:2012,价值:5},
{名称:'Bob',年份:2011,值:2},
];


log([…groupByName(条目)])给定名称的条目在数组中是否总是在一起(连续)?我对您的要求感到困惑。可能在某个地方会有一个“内部”循环,而内部循环并不一定会使算法效率低下。@Jerfov2,如果有一种有效的方法,即使使用内部循环也可以做到这一点,我很好。@Ry是的,你可以保证名称会在一起听起来像是过早的优化。除非你处理的是大量的价值观,否则你真的不需要担心如何优化它。但是,对了,您可以使用计数器的映射。给定名称的条目在数组中是否始终在一起(连续)?我对您的要求感到困惑。可能在某个地方会有一个“内部”循环,而内部循环并不一定会使算法效率低下。@Jerfov2,如果有一种有效的方法,即使使用内部循环也可以做到这一点,我很好。@Ry是的,你可以保证名称会在一起听起来像是过早的优化。除非你处理的是大量的价值观,否则你真的不需要担心如何优化它。但是,您可以使用计数器映射。您不应该向每个对象添加所有日期,因此数组的第二个对象根本不应该有键
“2012”
,以此类推,如果有很多日期,则会向每个对象添加很多无用的键object@SaymoinSam,请看op的请求。我不知道他是否真的想要那样的行为,或者那就是他试图做的!这看起来很有希望。如果我们添加另一个变量,如“Age Group”?@somethingstrang,数据看起来如何以及结果如何?您不应该向每个对象添加所有日期,因此数组的第二个对象根本不应该有键
“2012”
,如果有很多日期,依此类推,然后,许多无用的密钥被添加到每个object@SaymoinSam,请看op的请求。我不知道他是否真的想要那样的行为,或者那是他试图做的!这看起来很有希望。如果我们添加另一个变量,比如“年龄组”,这会起作用吗?@somethingstrang,数据看起来怎么样,结果如何?