简体   繁体   English

根据ID顺序合并两个数组

[英]Merging two arrays in order based on id

I have 2 array of objects: 我有2个对象数组:

var parents = [
  { id: 77777, data: {}},
  { id: 88888, data: {}},
  { id: 99999, data: {}}
]


var children = [
  {
    belongTo: 77777,
    data: [
      { id: 111, data: {}},
      { id: 222, data: {}}
    ]},
  {
    belongTo: 99999,
    data: [
      { id: 333, data: {}}
    ]
  }
]

I would like to merge the parents and children into: 我想将父母和子女合并为:

var all = [
  { id: 77777, data: {}},
  { id: 111, data: {}},
  { id: 222, data: {}},
  { id: 88888, data: {}},
  { id: 99999, data: {}},
  { id: 333, data: {}}
]

] ]

I have been trying to use split or merge them together and then flatten but it was always very complicated. 我一直在尝试使用split或将它们合并在一起,然后展平,但这总是非常复杂。

What will be the easiest way to achieve that merge? 实现合并的最简单方法是什么?

My complicated way(which doesn't work) : 我的复杂方式(行不通)

children.map(function(child) {
  var parentIndex = parents.map(function(x) {return x.id}).indexOf(child.id)

  parents.splice(parentIndex + 1, 0, child.data)
})

[].concat.apply([], parents)

You just need some nested loops to get it: http://jsfiddle.net/hpfgqc4m/2/ 您只需要一些嵌套循环即可获取它: http : //jsfiddle.net/hpfgqc4m/2/

var parents = [
  { 
    id: 77777,
    data: {}
  },
  { 
    id: 88888,
    data: {}
  },
  { 
    id: 99999,
    data: {}
  }
]


var children = [
  {
    belongTo: 77777,
    data: [{
      id: 111,
      data: {}
    },
    {
      id: 222,
      data: {}
    }]
  },
  {
    belongTo: 99999,
    data: [{
      id: 333,
      data: {}
    }]
  }
]
var all = [];
parents.forEach(function(e, k) {
    all.push(e);
    children.forEach(function(el, key) {
        if (el.belongTo == e.id) {
            el.data.forEach(function(element) {
                all.push(element);            
            });                
        }
    });
});
console.log(all);  

Try this 尝试这个

 var parents = [{ id: 77777, data: {} }, { id: 88888, data: {} }, { id: 99999, data: {} }]; var children = [{ belongTo: 77777, data: [{ id: 111, data: {} }, { id: 222, data: {} }] }, { belongTo: 99999, data: [{ id: 333, data: {} }] }]; function merge(parents, children) { var parentsLen = parents.length, childLen = children.length, i, j, result = []; for (i = 0; i < parentsLen; i++) { result.push(parents[i]); for (j = 0; j < childLen; j++) { if (parents[i].id === children[j].belongTo) { result = result.concat(children[j].data); } }; } return result; } console.log(merge(parents, children)); 

Fix for your version 修复您的版本

 var parents = [{ id: 77777, data: {} }, { id: 88888, data: {} }, { id: 99999, data: {} }]; var children = [{ belongTo: 77777, data: [{ id: 111, data: {} }, { id: 222, data: {} }] }, { belongTo: 99999, data: [{ id: 333, data: {} }] }]; children.forEach(function(child) { var parentIndex = parents.map(function(x) {return x.id}).indexOf(child.id); parents.splice(parentIndex + 1, 0, child.data) }) parents = [].concat.apply([], parents) console.log(parents); 

Using Higher Order Functions and a bit of ES6 : 使用高阶函数和一些ES6

let merged = parents.map((parent) => {
  let child = children.filter((child) => child.belongTo == parent.id)
  let data = child.length > 0 ? child[0].data : []
  return [parent].concat(data)
})

console.log([].concat(...merged))

Can this be refactored further? 可以进一步重构吗?

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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