繁体   English   中英

Javascript-将子对象合并为公共父对象

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM