我正在用 lodash 尝试做以下事情。我有一个包含更多嵌套对象的对象数组,如下所示:
[{
id: 123,
name: 'John',
summary1: {
count: 3,
sum: 10,
},
summary2: {
count: 10,
sum: 20
},
},
...
]
Run Code Online (Sandbox Code Playgroud)
我想把这个数组的每个元素转换成这样的:
[{
id: 123,
name: 'John',
summary1_count: 3,
summary1_sum: 10
summary2_count: 10,
summary2_sum: 20,
},
...
]
Run Code Online (Sandbox Code Playgroud)
所以基本上我想“展平”数组的每个元素,以一种基于主键和子键确定对象键的方式。如何使用 lodash 或普通 JS 完成此操作?
您可以假设只有 1 级嵌套,如示例中所示。
您可以简单地使用 npm 包flat。
import flat from 'flat';
const array = [
{
a: 'a',
b: {
bb: 'bb',
},
c: {
cc1: 'cc1',
cc: {
ccc: 'ccc',
ccd: 'ccd',
},
},
},
// ...
];
const flattenedArray = array.map(flat);
/*
flattenedArray === [
{
a: 'a',
b.bb: 'bb',
c.cc1: 'cc1',
c.cc.ccc: 'ccc',
c.cc.ccd: 'ccd',
},
// ...
]
*/
Run Code Online (Sandbox Code Playgroud)
如果你想自己实现它,这是我的实现flat:
const flat = (obj, concatenator = '.') => (
Object.keys(obj).reduce(
(acc, key) => {
if (typeof obj[key] !== 'object') {
return {
...acc,
[key]: obj[key],
};
}
const flattenedChild = flat(obj[key], concatenator);
return {
...acc,
...Object.keys(flattenedChild).reduce((childAcc, childKey) => ({ ...childAcc, [`${key}${concatenator}${childKey}`]: flattenedChild[childKey] }), {}),
};
},
{},
)
);
const flattenedArray = array.map(o => flat(o));
Run Code Online (Sandbox Code Playgroud)
这些解决方案适用于任何深度。
您可以在没有 lodash(或其他库)的情况下完成此操作,方法是迭代原始数组中每个项目的键,检查它们的类型,并进一步迭代它们的内部键,构建新键来保存正确的值。
const array = [{
id: 123,
name: 'John',
summary1: {
count: 3,
sum: 10
},
summary2: {
count: 10,
sum: 20
}
}];
let newArray = array.map(item => {
let newObj = {};
Object.keys(item).forEach(key => {
if (typeof item[key] === 'object') {
Object.keys(item[key]).forEach(innerKey => {
newObj[`${key}_${innerKey}`] = item[key][innerKey];
});
} else {
newObj[key] = item[key];
}
});
return newObj;
});
console.log(newArray);Run Code Online (Sandbox Code Playgroud)
当然,这不一定非常漂亮或灵活(根据您对单层深度的假设)。
| 归档时间: |
|
| 查看次数: |
8584 次 |
| 最近记录: |