根据id按顺序合并两个数组

Merging two arrays in order based on id

本文关键字:两个 数组 id 顺序 合并 根据      更新时间:2023-09-26

我有两个对象数组:

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 = [
  { id: 77777, data: {}},
  { id: 111, data: {}},
  { id: 222, data: {}},
  { id: 88888, data: {}},
  { id: 99999, data: {}},
  { id: 333, data: {}}
]

]

我一直在尝试将它们拆分或合并在一起,然后压平,但这总是非常复杂。

实现合并的最简单方法是什么

我的复杂方式(不起作用)

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)

您只需要一些嵌套循环就可以获得它: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);  

试试这个

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));

修复您的版本

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);

使用高阶函数和一点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))

这可以进一步重构吗?