在您的
.map()
方法,你可以
destructure
要拉出的当前对象
node
/
collections
属性(在没有
collection
名为的新对象中的属性
rest
,在您的示例中,这只是一个具有
title
,但如果你有更多的属性,它也会包括这些)。然后你可以将其扩散到你的新对象中。然后,您可以选择添加
收藏
属性添加到使用对象属性排列创建的新对象
...
如果当前对象具有
收藏
属性使用
...(collections && {collections: removeEdgesAndNodes(collections)})
,如果
收藏
是
undefined
(因为它在你最内部的对象中),或者它会添加
收藏
属性映射到当前对象,通过递归调用您的
removeEdgesAndNodes
用于处理内部对象的函数:
const data = { products: { edges: [ { node: { title: 'x', collections: { edges: [ { node: { title: 'x - collection' } } ] } } } ] } }
function removeEdgesAndNodes(obj) {
return obj.edges.map(({node: {collections, ...rest}}) => ({
...rest,
...(collections && {collections: removeEdgesAndNodes(collections)})
}))
}
console.log(removeEdgesAndNodes(data.products));
您可以使用
for
循环和if语句,您可能会发现它们更可读:
const data = { products: { edges: [ { node: { title: 'x', collections: { edges: [ { node: { title: 'x - collection' } } ] } } } ] } };
function removeEdgesAndNodes(obj) {
const res = [];
for (const { node } of obj.edges) {
const { collections, ...rest } = node;
if (collections)
res.push({...rest, collections: removeEdgesAndNodes(collections)});
else
res.push(rest);
}
return res;
}
console.log(removeEdgesAndNodes(data.products));
要处理动态嵌套对象属性键,一种方法是重构每个对象。对于每个
key
和
value
在函数的输入对象中,可以检查value属性中的
edges
所有物如果它具有边属性,则可以映射该属性以删除动态属性名称(例如:
收藏
/
products
)通过递归地重建该对象:
const data = { products: { edges: [ { node: { title: 'x', collections: { edges: [ { node: { title: 'x - collection', products: { edges: [ { node: { title: 'product in x collection' } } ] } } } ] } } } ] } }
function removeEdgesAndNodes(obj) {
return Object.fromEntries(Object.entries(obj).map(([key, val]) => [
key,
val.edges?.map(({node}) => removeEdgesAndNodes(node)) ?? val
]));
}
console.log(removeEdgesAndNodes(data));