根据id按顺序合并两个数组
Merging two arrays in order based on id
我有两个对象数组:
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))
这可以进一步重构吗?
相关文章:
- 如何使用 node.js 比较两个 json 数组
- 用每小时的差值填充数组/列表-从下拉列表中给定两个时间值
- 访问$.ajax()函数中的两个不同数组
- 正在更新mongod中两个对象内部的数组
- 如何使用javascript合并两个对象数组
- 比较包含多个值对的两个JavaScript数组
- jQuery对象从html表中查询为两个一维数组,用于Chartist图表
- 检查来自不同数组的两个元素的一个属性是否相等
- 如何在javascript中合并两个对象数组
- JavaScript - 合并两个对象数组并根据属性值删除重复数据
- 效率:整数数组的一个子集中两个项之间的最大差值
- 将两个值组合成extjs 4.1的形式
- 如何将中的两个geoJSON功能集合添加到两个层组中
- 在 JQuery 验证中验证多个“数组命名”文件输入和下拉列表
- 在一个区间之间生成两个随机数组
- 使用两个捕获组和JavaScript的replace()函数
- 通过找到两个重复组之一的正则表达式组
- 从Javascript中的两个子数组中获取随机结果
- 如何在一个可选的非捕获组中创建两个捕获组
- paper.js:获取两个层/组的原始像素数据