我有一个对象,它有许多不必要的属性和我想要的深层嵌套属性。
我的目标是获取第一个对象并返回一个仅包含我想要的字段的新对象。
这是一个大对象的示例,以及我试图将其 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/