Javascript 仅获取对象的对象的一些关键点

Javascript 仅获取对象的对象的一些关键点,javascript,data-structures,mapping,reduce,Javascript,Data Structures,Mapping,Reduce,我有一个目标: const数据集={ "2019": { “a”:1, “b”:2, “c”:3, “d”:4 }, "2020": { “a”:2, “b”:4, “c”:6, “d”:8 }, "2021": { “a”:10, “b”:11, “c”:12, “d”:13 } } 我想获得这两个对象: const obj1={ "2019": { “a”:1, “c”:3, }, "2020": { “a”:2, “c”:6, }, "2021": { “a”:10, “c”:12, }

我有一个目标:

const数据集={
"2019": {
“a”:1,
“b”:2,
“c”:3,
“d”:4
},
"2020": {
“a”:2,
“b”:4,
“c”:6,
“d”:8
},
"2021": {
“a”:10,
“b”:11,
“c”:12,
“d”:13
}
}
我想获得这两个对象:

const obj1={
"2019": {
“a”:1,
“c”:3,
},
"2020": {
“a”:2,
“c”:6,
},
"2021": {
“a”:10,
“c”:12,
}
}
常数obj2={
"2019": {
“b”:2,
“d”:4
},
"2020": {
“b”:4,
“d”:8
},
"2021": {
“b”:11,
“d”:13
}
}
因此,根据内部对象的一些关键点将对象“拆分”为两个对象。 以下是我尝试过的:

功能选取键(dataObj,键){
返回Object.entries(dataObj.map)([d,obj])=>{
返回{[d]:{.pick(对象,键)}
})
}
const obj1=选取键(数据集,['a','c'])
结果是:

const obj1=[
{'2019':{a:1,c:3},
{'2020':{a:2,c:6},
{'2021':{a:10,c:12}
]

差不多了,但并不完美。哪种方法更好?

您可以使用
map
reduce
方法和一个
for····································。然后,您可以使用数组分解来获得两个单独的对象

const dataset={“2019”:{“a”:1,“b”:2,“c”:3,“d”:4},“2020”:{“a”:2,“b”:4,“c”:6,“d”:8},“2021”:{“a”:10,“b”:11,“c”:12,“d”:13}
常数[a,b]=[['a',c'],['b',d']]
.map(key=>key.reduce((r,key)=>{
用于(数据集中的年份){
如果(!r[year])r[year]={}
r[year][key]=数据集[year][key]
}
返回r;
}, {}))
控制台日志(a)

console.log(b)
您可以使用
map
reduce
方法和一个
for…in
循环的组合来完成此操作,该循环将键数组转换为对象数组。然后,您可以使用数组分解来获得两个单独的对象

const dataset={“2019”:{“a”:1,“b”:2,“c”:3,“d”:4},“2020”:{“a”:2,“b”:4,“c”:6,“d”:8},“2021”:{“a”:10,“b”:11,“c”:12,“d”:13}
常数[a,b]=[['a',c'],['b',d']]
.map(key=>key.reduce((r,key)=>{
用于(数据集中的年份){
如果(!r[year])r[year]={}
r[year][key]=数据集[year][key]
}
返回r;
}, {}))
控制台日志(a)
log(b)
问题在于,当您需要一个对象时,返回一个包含替换元素的数组

因为您已经在使用Lodash,所以可以使用它来转换对象的值,并返回对象而不是数组

function pickKeys(dataObj, keys) {
  return _.mapValues(dataObj, obj => _.pick(obj, keys));
}
功能选取键(dataObj,键){
返回j.mapValues(dataObj,obj=>j.pick(obj,keys));
}
常量数据集={
"2019": {
“a”:1,
“b”:2,
“c”:3,
“d”:4
},
"2020": {
“a”:2,
“b”:4,
“c”:6,
“d”:8
},
"2021": {
“a”:10,
“b”:11,
“c”:12,
“d”:13
}
}
log(pickkey(数据集,[“a”,“c]”)
问题在于,当您需要一个对象时,返回一个包含替换元素的数组

因为您已经在使用Lodash,所以可以使用它来转换对象的值,并返回对象而不是数组

function pickKeys(dataObj, keys) {
  return _.mapValues(dataObj, obj => _.pick(obj, keys));
}
功能选取键(dataObj,键){
返回j.mapValues(dataObj,obj=>j.pick(obj,keys));
}
常量数据集={
"2019": {
“a”:1,
“b”:2,
“c”:3,
“d”:4
},
"2020": {
“a”:2,
“b”:4,
“c”:6,
“d”:8
},
"2021": {
“a”:10,
“b”:11,
“c”:12,
“d”:13
}
}
log(pickkey(数据集,[“a”,“c]”)

您可以使用给定对象的条目映射想要的键

const
数据集={2019:{a:1,b:2,c:3,d:4},2020:{a:2,b:4,c:6,d:8},2021:{a:10,b:11,c:12,d:13},
组=['a','c'],['b','d'],
[result1,result2]=对象
.条目(数据集)
.reduce((r[k,o])=>
groups.map((组,i)=>
减少(
(q,g)=>({…q[k]:{…q[k],[g]:o[g]}),
r[i]|{}
)
),
[]
);
console.log(result1);
console.log(result2)

.as console wrapper{max height:100%!important;top:0;}
您可以使用给定对象的条目映射想要的键

const
数据集={2019:{a:1,b:2,c:3,d:4},2020:{a:2,b:4,c:6,d:8},2021:{a:10,b:11,c:12,d:13},
组=['a','c'],['b','d'],
[result1,result2]=对象
.条目(数据集)
.reduce((r[k,o])=>
groups.map((组,i)=>
减少(
(q,g)=>({…q[k]:{…q[k],[g]:o[g]}),
r[i]|{}
)
),
[]
);
console.log(result1);
console.log(result2)

.as console wrapper{max height:100%!important;top:0;}
提供的下一个示例代码是基于通用的,但其用法是可配置的

函数createAndCollectSubdata(收集器,数据条目){
const{keyLists,subdataList}=收集器;
const[dataKey,dataValue]=数据项;
keyLists.forEach((keyList,idx)=>{
常量数据=子数据列表[idx]| |(子数据列表[idx]={});
const subdata=data[dataKey]| |(data[dataKey]={});
forEach(key=>subdata[key]=dataValue[key]);
});
回程收集器;
}
常量数据集={
"2019": {
“a”:1,
“b”:2,
“c”:3,
“d”:4
},
"2020": {
“a”:2,
“b”:4,
“c”:6,
“d”:8
},
"2021": {
“a”:10,
“b”:11,
“c”:12,
“d”:13
}
};
常数[
acSubdata,
bdSubdata
]=Object.entries(数据集).reduce(createAndCollectSubdata{
密钥列表:[“a”、“c”]、[“b”、“d”],
子数据列表:[]
}).子数据表;
console.log('acSubdata:',acSubdata);
console.log('bdSubdata:',bdSubdata)
。作为控制台包装{min heigh