javascript - 使用 lodash 或 es6 编写一个函数,该函数接受具有深度嵌套属性的对象并返回仅具有选定属性的新对象

标签 javascript reactjs redux lodash

我有一个对象,它有许多不必要的属性和我想要的深层嵌套属性。

我的目标是获取第一个对象并返回一个仅包含我想要的字段的新对象。

这是一个大对象的示例,以及我试图将其 reshape 为的示例:

let bigObject = {
  id: 1,
  a: 'a',
  b: 'b',
  c: 'c',
  vLines: [
    {
      vouchId: 1,
      vouchLineId: 1,
      dontNeedThisProperty: 'blah',
      a2: 'a',
      rejection: 'vLine rejection reason 1',
      dLines: [
        {
          id: 1,
          rejection: 'dline rejection reason 1',
          amount: 12345,
          vouchLineId: 1
        }
      ]
    },
  ]
}

我想把它 trim 成这样:

let newObject = {
  id: 1,
  vLines: [
    {
      vouchId: 1,
      vouchLineId: 1,
      rejection: 'vLine rejection reason 1'
    }
  ],
  dLines: [
    {
      id: 1,
      rejection: 'dline rejection reason 1',
      vouchLineId: 1
    }
  ]
}

我有一个 redux 选择器,它可以帮助我完成部分工作,但我在获取 dLine 的那些深层嵌套属性时遇到了困难

import { createSelector } from 'reselect';
import { isEqual, pick } from 'lodash';

export const testSelector = createSelector(
  nestedSelectedSelector,
  vouch => pick(vouch, ['id', 'vLines'])
);

最佳答案

它并不漂亮或干净,但这会产生您期望的输出。可能有一种更有效的方法可以在 dLines 上执行 flatMap() 函数,这样您就不必执行另一个 map() 之后,但这是我快速而肮脏的做法。

let bigObject = {
  id: 1,
  a: 'a',
  b: 'b',
  c: 'c',
  vLines: [
    {
      vouchId: 1,
      vouchLineId: 1,
      dontNeedThisProperty: 'blah',
      a2: 'a',
      rejection: 'vLine rejection reason 1',
      dLines: [
        {
          id: 1,
          rejection: 'dline rejection reason 1',
          amount: 12345,
          vouchLineId: 1
        }
      ]
    },
  ]
};

// How you said you wanted it to look...
/*
let newObject = {
  id: 1,
  vLines: [
    {
      vouchId: 1,
      vouchLineId: 1,
      rejection: 'vLine rejection reason 1'
    }
  ],
  dLines: [
    {
      id: 1,
      rejection: 'dline rejection reason 1',
      vouchLineId: 1
    }
  ]
}*/

const newObject = _.chain(bigObject)
  .pick(['id'])
  .set('vLines', _.chain(bigObject.vLines).map(vLine => _.pick(vLine, ['vouchId', 'vouchLineId', 'rejection'])).value())
  .set('dLines', _.chain(bigObject.vLines).flatMap('dLines').map(dLine => _.pick(dLine, ['id', 'vouchLineId', 'rejection'])).value())
  .value();
  
console.log(newObject)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.15/lodash.min.js"></script>

关于javascript - 使用 lodash 或 es6 编写一个函数,该函数接受具有深度嵌套属性的对象并返回仅具有选定属性的新对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60713455/

相关文章:

javascript - 类型错误 : Cannot read property 'events' of undefined

reactjs - Apollo 客户端缓存与 Redux

javascript - 动态链接和 jQuery Lightbox 问题 : Loading image in lightbox. ..完全被难住了!

php - 将带有 httprequest 的 POST 发送到 php

javascript - Mouseenter/mouseleave 多个 div

javascript - 函数中输入标签的问题 - React JS

javascript - 如何仅在第一次播放声音 false value after true

reactjs - 我在使用预加载函数通过 react-p5 库加载图像时遇到问题

javascript - 计算不同的输入值,将它们相加并显示结果

javascript - 修改 react-boilerplate 以在 store 的单个键下嵌套注入(inject)的 reducer