如何在不删除顶层的情况下将嵌套对象移动到顶层?
How to move nested object into top level without removing top level?
假设我有这个数据:
data = [{
"_id" : "2fApaxgiPx38kpDLA",
"profile" : {
"name" : "Karina 1",
"avatar" : "avatar1.jpg",
"bio" : "my bio 1"
},
{
"_id" : "NXM6H4EWfeRAAhB7c",
"profile" : {
"name" : "Karina 2",
"avatar" : "avatar2.jpg",
"bio" : "my bio 2"
},
}];
我做了 _.map(data, "profile")
但它删除了顶级 _id:
wrongResult = [{
"name" : "Karina 1",
"avatar" : "avatar1.jpg",
"bio" : "my bio 1"
},
{
"name" : "Karina 2",
"avatar" : "avatar2.jpg",
"bio" : "my bio 2"
}];
如何在不移除顶层的情况下将嵌套对象移动到顶层:
expectedResult = [{
"_id" : "2fApaxgiPx38kpDLA",
"name" : "Karina 1",
"avatar" : "avatar1.jpg",
"bio" : "my bio 1"
},
{
"_id" : "NXM6H4EWfeRAAhB7c",
"name" : "Karina 2",
"avatar" : "avatar2.jpg",
"bio" : "my bio 2"
}];
非常感谢....
像这样的? (未测试)
_.map(data,function(d){
d.profile._id = d._id;
return d.profile;
});
最近需要自己做这样的事情。最终编写了一个通用函数以将所有(嵌套的)对象值带到顶层:
const reduceObjValues = (obj, cache = {}) => {
const objectValues = Object.keys(obj).reduce((acc, cur) => {
if (!Array.isArray(obj[cur]) && typeof obj[cur] === 'object') {
return reduceObjValues({ ...acc, ...obj[cur] }, cache);
}
acc[cur] = obj[cur];
return acc;
}, {});
return {
...objectValues,
...cache,
};
}
reduceObjValues({
a: {
b: 'a',
c: 'b',
},
d: {
e: 'a',
f: {
g: {
h: [
1,
2,
3,
]
}
}
}
});
=> { b: 'a', c: 'b', e: 'a', h: [ 1, 2, 3 ] }
此函数的一个问题是它会覆盖任何相同的键。
您可以使用展平将嵌套对象移动到其父级别...https://www.npmjs.com/package/flat
由于您使用的是 lodash,我想出了一个通用函数来展平任何深度嵌套的对象。
const flattener = obj => {
const toPairs = obj => _.entries(obj).map(([key, val]) => typeof val === 'object' ? toPairs(val) : [key, val]);
return _.chain(toPairs(obj)).flattenDeep().chunk(2).fromPairs().value();
}
所以,像这样的数组
data = [
{
"_id" : "2fApaxgiPx38kpDLA",
"profile" : {
"name" : "Karina 1",
"avatar" : "avatar1.jpg",
"bio" : "my bio 1"
}
},
{
"_id" : "NXM6H4EWfeRAAhB7c",
"profile" : {
"name" : "Karina 2",
"avatar" : "avatar2.jpg",
"bio" : "my bio 2"
},
}
]
你可以做到
data.map(obj => flattener(obj))
这会给你
[
{
"_id": "2fApaxgiPx38kpDLA",
"name": "Karina 1",
"avatar": "avatar1.jpg",
"bio": "my bio 1"
},
{
"_id": "NXM6H4EWfeRAAhB7c",
"name": "Karina 2",
"avatar": "avatar2.jpg",
"bio": "my bio 2"
}
]
注意: 这个 flattener
函数会丢弃重复的对象键,所以如果你有一个像这样的对象;
myObj = { name: 'rick', age: 10, country: { name: 'uganda' } }
通过调用 flattener(myObj)
将其展平将导致
{ name: 'uganda', age: 10 }
不在
{ name: 'uganda', age: 10, name: 'rick' }
因为您不能拥有具有 2 个相似键的对象,即使这些键的值是唯一的。
假设我有这个数据:
data = [{
"_id" : "2fApaxgiPx38kpDLA",
"profile" : {
"name" : "Karina 1",
"avatar" : "avatar1.jpg",
"bio" : "my bio 1"
},
{
"_id" : "NXM6H4EWfeRAAhB7c",
"profile" : {
"name" : "Karina 2",
"avatar" : "avatar2.jpg",
"bio" : "my bio 2"
},
}];
我做了 _.map(data, "profile")
但它删除了顶级 _id:
wrongResult = [{
"name" : "Karina 1",
"avatar" : "avatar1.jpg",
"bio" : "my bio 1"
},
{
"name" : "Karina 2",
"avatar" : "avatar2.jpg",
"bio" : "my bio 2"
}];
如何在不移除顶层的情况下将嵌套对象移动到顶层:
expectedResult = [{
"_id" : "2fApaxgiPx38kpDLA",
"name" : "Karina 1",
"avatar" : "avatar1.jpg",
"bio" : "my bio 1"
},
{
"_id" : "NXM6H4EWfeRAAhB7c",
"name" : "Karina 2",
"avatar" : "avatar2.jpg",
"bio" : "my bio 2"
}];
非常感谢....
像这样的? (未测试)
_.map(data,function(d){
d.profile._id = d._id;
return d.profile;
});
最近需要自己做这样的事情。最终编写了一个通用函数以将所有(嵌套的)对象值带到顶层:
const reduceObjValues = (obj, cache = {}) => {
const objectValues = Object.keys(obj).reduce((acc, cur) => {
if (!Array.isArray(obj[cur]) && typeof obj[cur] === 'object') {
return reduceObjValues({ ...acc, ...obj[cur] }, cache);
}
acc[cur] = obj[cur];
return acc;
}, {});
return {
...objectValues,
...cache,
};
}
reduceObjValues({
a: {
b: 'a',
c: 'b',
},
d: {
e: 'a',
f: {
g: {
h: [
1,
2,
3,
]
}
}
}
});
=> { b: 'a', c: 'b', e: 'a', h: [ 1, 2, 3 ] }
此函数的一个问题是它会覆盖任何相同的键。
您可以使用展平将嵌套对象移动到其父级别...https://www.npmjs.com/package/flat
由于您使用的是 lodash,我想出了一个通用函数来展平任何深度嵌套的对象。
const flattener = obj => {
const toPairs = obj => _.entries(obj).map(([key, val]) => typeof val === 'object' ? toPairs(val) : [key, val]);
return _.chain(toPairs(obj)).flattenDeep().chunk(2).fromPairs().value();
}
所以,像这样的数组
data = [
{
"_id" : "2fApaxgiPx38kpDLA",
"profile" : {
"name" : "Karina 1",
"avatar" : "avatar1.jpg",
"bio" : "my bio 1"
}
},
{
"_id" : "NXM6H4EWfeRAAhB7c",
"profile" : {
"name" : "Karina 2",
"avatar" : "avatar2.jpg",
"bio" : "my bio 2"
},
}
]
你可以做到
data.map(obj => flattener(obj))
这会给你
[
{
"_id": "2fApaxgiPx38kpDLA",
"name": "Karina 1",
"avatar": "avatar1.jpg",
"bio": "my bio 1"
},
{
"_id": "NXM6H4EWfeRAAhB7c",
"name": "Karina 2",
"avatar": "avatar2.jpg",
"bio": "my bio 2"
}
]
注意: 这个 flattener
函数会丢弃重复的对象键,所以如果你有一个像这样的对象;
myObj = { name: 'rick', age: 10, country: { name: 'uganda' } }
通过调用 flattener(myObj)
将其展平将导致
{ name: 'uganda', age: 10 }
不在
{ name: 'uganda', age: 10, name: 'rick' }
因为您不能拥有具有 2 个相似键的对象,即使这些键的值是唯一的。