[英]flatten an array of objects recursively
我具有以下对象数组。如何将多维对象数组展平为一维对象数组?
[{
"name":"Locations",
"children":[
{
"name":"U.S."
},
{
"name":"Canada"
},
{
"name":"London"
}
]
},{
"name":"Benefits",
"children":[
{
"name":"U.S. Benefits",
"children":[
{
"name":"U.S. Benefits at a Glance"
},
{
"name":"U.S. Holiday Calendar"
}
]
},
{
"name":"London Benefits",
"children":[
{
"name":"London Benefits at a Glance"
},
{
"name":"London Holiday Calendar"
}
]
},
{
"name":"India Benefits",
"children":[
{
"name":"India Benefits at a Glance"
},
{
"name":"India Holiday Calendar"
}
]
}
]
}]
我需要所有的孩子在一个单一的维度上与父母处于同一水平,任何帮助将不胜感激。
您可以使用reduce
和spread语法在没有lodash的情况下完成此操作。 您只需要为孩子使用递归。
const data = [{"name":"Locations","children":[{"name":"US"},{"name":"Canada"},{"name":"London"}]},{"name":"Benefits","children":[{"name":"US Benefits","children":[{"name":"US Benefits at a Glance"},{"name":"US Holiday Calendar"}]},{"name":"London Benefits","children":[{"name":"London Benefits at a Glance"},{"name":"London Holiday Calendar"}]},{"name":"India Benefits","children":[{"name":"India Benefits at a Glance"},{"name":"India Holiday Calendar"}]}]}] const flatten = data => { return data.reduce((r, { children, ...rest}) => { r.push(rest); if (children) r.push(...flatten(children)); return r; }, []) } console.log(flatten(data))
您可以执行递归循环,并通过使用辅助函数将其追加到运行列表中。
注意:如果要删除“根”虚拟节点,只需对数组进行slice(1)
。
var flattened = flattenTree({ "name" : "root", // Need a root entry, because the data is an array "children" : getData() // Grab the data at the bottom }, { nameKey : 'name', // The name key; configurable option childrenKey : 'children' // The children key; configurable option }); console.log(flattened); // Flattened data printed to the console function flattenTree(tree, options) { options = options || {}; var nameKey = options.nameKey || 'name'; var childrenKey = options.childrenKey || 'children' var resultList = []; flattenTreeRecurse(tree, resultList, nameKey, childrenKey); return resultList; } /** @private -- Recursive inner-call */ function flattenTreeRecurse(tree, list, nameKey, childrenKey) { var entry = {}; entry[nameKey] = tree[nameKey]; list.push(entry); if (tree[childrenKey] && tree[childrenKey].length > 0) { tree[childrenKey].forEach(child => flattenTreeRecurse(child, list, nameKey, childrenKey)); } } function getData() { return [{ "name": "Locations", "children": [{ "name": "US" }, { "name": "Canada" }, { "name": "London" }] }, { "name": "Benefits", "children": [{ "name": "US Benefits", "children": [{ "name": "US Benefits at a Glance" }, { "name": "US Holiday Calendar" }] }, { "name": "London Benefits", "children": [{ "name": "London Benefits at a Glance" }, { "name": "London Holiday Calendar" }] }, { "name": "India Benefits", "children": [{ "name": "India Benefits at a Glance" }, { "name": "India Holiday Calendar" }] } ] }]; }
.as-console-wrapper { top: 0; max-height: 100% !important; }
将@ nenad-vracar的答案修改为更可重用的样式:
const mock = [{"name":"Locations","children":[{"name":"US"},{"name":"Canada"},{"name":"London"}]},{"name":"Benefits","children":[{"name":"US Benefits","children":[{"name":"US Benefits at a Glance"},{"name":"US Holiday Calendar"}]},{"name":"London Benefits","children":[{"name":"London Benefits at a Glance"},{"name":"London Holiday Calendar"}]},{"name":"India Benefits","children":[{"name":"India Benefits at a Glance"},{"name":"India Holiday Calendar"}]}]}]; const flatDeepByKey = (data, key) => { return data.reduce((prev, el) => { prev.push(el); if (el[key]) { prev.push(...flatDeepByKey(el[key], key)) }; return prev; }, []) }; console.log(flatDeepByKey(mock, 'children'));
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.