[英]Javascript - merge child objects into common parent
我在这样的结构中有一个带有嵌套子项数组的父对象数组:
[
{
"fullName": "Certificate",
"checked": false,
"children": [
{
"type": "Certificate",
"lastModifiedDate": "1971-01-01T00:00:00.000Z",
"fullName": "Certificate-1",
}
]
},
{
"fullName": "InstalledPackage", "checked": false, "children": [ { "type": "InstalledPackage", "lastModifiedDate": "1971-01-01T00:00:00.000Z", "fullName": "Package1", } ] }, { "fullName": "InstalledPackage", "checked": false, "children": [ { "type": "InstalledPackage", "lastModifiedDate": "1971-01-01T00:00:00.000Z", "fullName": "Package2", } ] },
{
"fullName": "Network",
"checked": false,
"children": [
{
"type": "InstalledPackage",
"lastModifiedDate": "1971-01-01T00:00:00.000Z",
"fullName": "Network1",
}
]
}
]
我想在将子级推在一起的同时合并具有相同“ fullName”的所有父级节点。 所需的输出是:
[
{
"fullName": "Certificate",
"checked": false,
"children": [
{
"type": "Certificate",
"lastModifiedDate": "1971-01-01T00:00:00.000Z",
"fullName": "Certificate-1",
}
]
},
{
"fullName": "InstalledPackage", "checked": false, "children": [ { "type": "InstalledPackage", "lastModifiedDate": "1971-01-01T00:00:00.000Z", "fullName": "Package1", }, { "type": "InstalledPackage", "lastModifiedDate": "1971-01-01T00:00:00.000Z", "fullName": "Package2", } ] },
{
"fullName": "Network",
"checked": false,
"children": [
{
"type": "InstalledPackage",
"lastModifiedDate": "1971-01-01T00:00:00.000Z",
"fullName": "Network1",
}
]
}
]
是否有一种优雅的方法(使用lodash或其他方法)来实现这一目标? 我已经根据此处找到的答案尝试了多种循环解决方案,但我一直无法完全正确。 有任何想法吗?
@Andy,我尝试的大多数代码都是基于超链接中的答案,一种很有希望的尝试是:
function mergeNames (arr) {
return _.chain(arr).groupBy('fullName').mapValues(function (v) {
return _.chain(v).map('fullName').flattenDeep();
}).value();
}
console.log(mergeNames(array));
但是,此输出是“ lodash包装器”吗? 并不能完全正确地将子级放在一起-我想也许是因为我在子级和父级都具有相同的标识符(fullName)? 当我运行此代码并复制chrom控制台的输出时,得到以下信息:
{
"Certificate": [
"Certificate"
],
"InstalledPackage": [
"InstalledPackage",
"InstalledPackage"
],
"Network": [
"Network"
]
}
您可以使用Array.prototype
方法来做到这一点:
let data = [ { "fullName": "Certificate", "checked": false, "children": [ { "type": "Certificate", "lastModifiedDate": "1971-01-01T00:00:00.000Z", "fullName": "Certificate-1", } ] }, { "fullName": "InstalledPackage", "checked": false, "children": [ { "type": "InstalledPackage", "lastModifiedDate": "1971-01-01T00:00:00.000Z", "fullName": "Package1", } ] }, { "fullName": "InstalledPackage", "checked": false, "children": [ { "type": "InstalledPackage", "lastModifiedDate": "1971-01-01T00:00:00.000Z", "fullName": "Package2", } ] }, { "fullName": "Network", "checked": false, "children": [ { "type": "InstalledPackage", "lastModifiedDate": "1971-01-01T00:00:00.000Z", "fullName": "Network1", } ] } ]; let result = data.reduce((res, elem) => { let arrForChecking = res.filter((el) => el.fullName === elem.fullName); if (arrForChecking.length) { arrForChecking[0].children.push(elem.children[0]); return res; } return res = res.concat(elem); }, []); console.log(result);
您可以定义组合分组的键,并在将单个组推送到结果数组时使用哈希表进行分组。
var array = [{ fullName: "Certificate", checked: false, children: [{ type: "Certificate", lastModifiedDate: "1971-01-01T00:00:00.000Z", fullName: "Certificate-1" }] }, { fullName: "InstalledPackage", checked: false, children: [{ type: "InstalledPackage", lastModifiedDate: "1971-01-01T00:00:00.000Z", fullName: "Package1" }] }, { fullName: "InstalledPackage", checked: false, children: [{ type: "InstalledPackage", lastModifiedDate: "1971-01-01T00:00:00.000Z", fullName: "Package2" }] }, { fullName: "Network", checked: false, children: [{ type: "InstalledPackage", lastModifiedDate: "1971-01-01T00:00:00.000Z", fullName: "Network1" }] }], hash = Object.create(null), keys = ['fullName', 'checked'], grouped = []; array.forEach(function (o) { var key = keys.map(function (k) { return o[k]; }).join('|'); if (!hash[key]) { hash[key] = {}; keys.forEach(function (k) { hash[key][k] = o[k]; }); hash[key].children = []; grouped.push(hash[key]); } hash[key].children = hash[key].children.concat(o.children); }); console.log(grouped);
.as-console-wrapper { max-height: 100% !important; top: 0; }
ES6
var array = [{ fullName: "Certificate", checked: false, children: [{ type: "Certificate", lastModifiedDate: "1971-01-01T00:00:00.000Z", fullName: "Certificate-1" }] }, { fullName: "InstalledPackage", checked: false, children: [{ type: "InstalledPackage", lastModifiedDate: "1971-01-01T00:00:00.000Z", fullName: "Package1" }] }, { fullName: "InstalledPackage", checked: false, children: [{ type: "InstalledPackage", lastModifiedDate: "1971-01-01T00:00:00.000Z", fullName: "Package2" }] }, { fullName: "Network", checked: false, children: [{ type: "InstalledPackage", lastModifiedDate: "1971-01-01T00:00:00.000Z", fullName: "Network1" }] }], hash = Object.create(null), keys = ['fullName', 'checked'], grouped = []; array.forEach(function (o) { var key = keys.map(k => o[k]).join('|'); if (!hash[key]) { hash[key] = Object.assign({}, o); grouped.push(hash[key]); return; } hash[key].children.push(...o.children); }); console.log(grouped);
.as-console-wrapper { max-height: 100% !important; top: 0; }
干得好
as = [
{
"fullName": "Certificate",
"checked": false,
"children": [
{
"type": "Certificate",
"lastModifiedDate": "1971-01-01T00:00:00.000Z",
"fullName": "Certificate-1",
}
]
},
{
"fullName": "InstalledPackage",
"checked": false,
"children": [
{
"type": "InstalledPackage",
"lastModifiedDate": "1971-01-01T00:00:00.000Z",
"fullName": "Package1",
}
]
},
{
"fullName": "InstalledPackage",
"checked": false,
"children": [
{
"type": "InstalledPackage",
"lastModifiedDate": "1971-01-01T00:00:00.000Z",
"fullName": "Package2",
}
]
},
{
"fullName": "Network",
"checked": false,
"children": [
{
"type": "InstalledPackage",
"lastModifiedDate": "1971-01-01T00:00:00.000Z",
"fullName": "Network1",
}
]
}
]
ad = []
i=-1
as.forEach(function(item, index){
if(index>0){
i=i+1
if(as[index]['fullName'] === as[i]['fullName']) {
item['children'] = item['children'].concat(as[i]['children'])
ad[ad.length - 1] = item
} else {
ad.push(item)
}
} else {
ad.push(item)
}
})
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.