首页 > 解决方案 > 仅获取对象对象的一些键

问题描述

我有这个对象:

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 } }
]

所以几乎就在那里,但它并不完美。哪种方法更好?

标签: javascriptdata-structuresmappingreduce

解决方案


您可以使用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)


推荐阅读