javascript - 仅获取对象对象的一些键
问题描述
我有这个对象:
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
}
}
我想获得这两个对象:
const obj1 = {
"2019": {
"a": 1,
"c": 3,
},
"2020": {
"a": 2,
"c": 6,
},
"2021": {
"a": 10,
"c": 12,
}
}
const obj2 = {
"2019": {
"b": 2,
"d": 4
},
"2020": {
"b": 4,
"d": 8
},
"2021": {
"b": 11,
"d": 13
}
}
因此,根据内部对象的某些键将对象“拆分”为两个对象。这是我尝试过的:
function pickKeys(dataObj, keys) {
return Object.entries(dataObj).map(([d, obj]) => {
return { [d]: _.pick(obj, keys) }
})
}
const obj1 = pickKeys(dataset, ['a', 'c'])
结果是:
const obj1 = [
{ '2019': { a: 1, c: 3 } },
{ '2020': { a: 2, c: 6 } },
{ '2021': { a: 10, c: 12 } }
]
所以几乎就在那里,但它并不完美。哪种方法更好?
解决方案
您可以使用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}}
const [a, b] = [['a', 'c'], ['b', 'd']]
.map(keys => keys.reduce((r, key) => {
for (let year in dataset) {
if (!r[year]) r[year] = {}
r[year][key] = dataset[year][key]
}
return r;
}, {}))
console.log(a)
console.log(b)
推荐阅读
- python - 如何将 Pandas 日期时间列的时间更改为午夜?
- python - 如何在 Python 中使用 if-else 语句在多个变量之间切换
- sql - 执行错误:CREATE DATABASE aNewDb。原因:org.postgresql.util.PSQLException:错误:CREATE DATABASE 不能在事务块内运行
- protobuf-net - 类型“Namespace.SomeAbstractType”只能参与一个继承层次结构(Namespace.InterfaceType)
- node.js - Express - 当 POST 请求按预期运行时,为什么 PUT 请求会返回 404 错误?
- javascript - 如何关闭间隔循环
- javascript - 为渲染器使用预定义的画布会导致麻烦
- python - ModuleNotFoundError:使用“pip install numpy”后没有名为“numpy”的模块
- javascript - 为什么 useReducer 的调度会导致重新渲染?
- java - Java:循环的 Thread.sleep() 是否总是在同一个物理内核上运行?