仅获取对象的某些键

如何解决仅获取对象的某些键

我有这个对象:

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

const obj2 = {
  "2019": {
    "b": 2,"2020": {
    "b": 4,"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 } }
]

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

解决方法

您可以使用mapreduce方法和一个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)

,

问题是map返回一个带有替换元素的数组,而您需要一个对象。

由于您已经在使用Lodash,因此可以使用mapValues来转换对象的值并返回对象而不是数组。

function pickKeys(dataObj,keys) {
  return _.mapValues(dataObj,obj => _.pick(obj,keys));
}

function pickKeys(dataObj,keys));
}

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

console.log(pickKeys(dataset,["a","c"]));
<script src="https://cdn.jsdelivr.net/npm/lodash@4.17.15/lodash.min.js"></script>

,

您可以使用给定对象的条目来映射所需的键。

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 } },groups = [['a','d']],[result1,result2] = Object
        .entries(dataset)
        .reduce((r,[k,o]) =>
            groups.map((group,i) =>
                group.reduce(
                    (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; }

,

下一个提供的示例代码基于reduce,是通用的,但其用法可以配置...

function createAndCollectSubdata(collector,dataEntry) {

  const { keyLists,subdataList } = collector;
  const [ dataKey,dataValue ] = dataEntry;

  keyLists.forEach((keyList,idx) => {

    const data = subdataList[idx] || (subdataList[idx] = {});
    const subdata = data[dataKey] || (data[dataKey] = {}) ;

    keyList.forEach(key => subdata[key] = dataValue[key]);
  });
  return collector;
}

const dataset = {
  "2019": {
    "a": 1,"d": 13
  }
};
const [

  acSubdata,bdSubdata
  
] = Object.entries(dataset).reduce(createAndCollectSubdata,{

  keyLists: [["a","c"],["b","d"]],subdataList: []

}).subdataList;

console.log('acSubdata :',acSubdata);
console.log('bdSubdata :',bdSubdata);
.as-console-wrapper { min-height: 100%!important; top: 0; }

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?