首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >深度合并嵌套数组

深度合并嵌套数组
EN

Stack Overflow用户
提问于 2016-11-21 03:40:05
回答 3查看 859关注 0票数 0

我必须合并两个键值的数组,如下所示:

代码语言:javascript
复制
array1 = [
{id:"123", data:[{id:"234",data:"hello"},{id:"345",data:"there"},{id:"xyz", data:"yo"}]},
{id:"456", data:[{id:"34",data:"test"},{id:"45",data:"test2"},{id:"yz", data:"test3"}]},
{id:"789", data:[{id:"23",data:"aaa"},{id:"34",data:"bbb"},{id:"xy", data:"ccc"}]}]

使用

代码语言:javascript
复制
array2 = [
{id:"456", data:[{id:"45",data:"changed"},{id:"yz", data:"data"}]},
{id:"789", data:[{id:"456",data:"appended data"}]},
{id:"890", data:[{id:"456",data:"new data"}]}]

生产出这样的东西

代码语言:javascript
复制
merged = [
{id:"123", data:[{id:"234",data:"hello"},{id:"345",data:"there"},{id:"xyz", data:"yo"}]},
{id:"456", data:[{id:"34",data:"test"},{id:"45",data:"changed"},{id:"yz", data:"data"}]},
{id:"789", data:[{id:"23",data:"aaa"},{id:"34",data:"bbb"},{id:"xy", data:"ccc"},{id:"456",data:"appended data"}]},
{id:"890", data:[{id:"456",data:"new data"}]}]

我已经尝试了很长一段时间了,但无法找到一个符合这种情况的解决方案。大多数解决方案只是进行盲目合并,而不是基于id值。尝试使用mergeWith,但没有得到所需的输出。拉姆达解决方案也是可以接受的。

谢谢,

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-12-27 06:34:08

最后,这才是对我有用的东西。感谢@Geeky为您指明了方向:

代码语言:javascript
复制
function mergeArrays(arr1, arr2) {
  var arr3, arrIdx = [];
  if (!arr1 || arr1.length ==0) return arr2
  for (var i in arr1) {
    var shared = false;
    for (var j in arr2)
      if (arr2[j].id == arr1[i].id) {
        shared = true;
        joined = _.mergeWith({},arr1[i],arr2[j], function (a,b) {
          if (_.isArray(a)) return b.concat(a)})
        arr3.push(joined);
        break;
      }
    if (!shared) {
      arr3.push(arr1[i]);
    }
  }
  for (var k in arr2) {
    if (arrIdx[k] !=k) arr3.push(arr2[k])
  }
  return arr3

}
票数 0
EN

Stack Overflow用户

发布于 2016-11-21 05:10:29

这个链接可能会对你的合并两个数组有所帮助。

在这个代码片段中,我试图找到set1和set2之间的公共对象,如果有,我要找到唯一的属性,更改它们的内容,以及object2中不存在的属性,并将其推送到object1

检查下面的片段。

代码语言:javascript
复制
var arr1 = [{
  id: "123",
  data: [{
    id: "234",
    data: "hello"
  }, {
    id: "345",
    data: "there"
  }, {
    id: "xyz",
    data: "yo"
  }]
}, {
  id: "456",
  data: [{
    id: "34",
    data: "test"
  }, {
    id: "45",
    data: "test2"
  }, {
    id: "yz",
    data: "test3"
  }]
}, {
  id: "789",
  data: [{
    id: "23",
    data: "aaa"
  }, {
    id: "34",
    data: "bbb"
  }, {
    id: "xy",
    data: "ccc"
  }]
}]

var arr2 = [{
  id: "456",
  data: [{
    id: "45",
    data: "changed"
  }, {
    id: "yz",
    data: "data"
  }]
}, {
  id: "789",
  data: [{
    id: "456",
    data: "appended data"
  }]
}, {
  id: "890",
  data: [{
    id: "456",
    data: "new data"
  }]
}]
var arr3 = [];
for (var i in arr1) {
  var shared = false;
  for (var j in arr2)
    if (arr2[j].id == arr1[i].id) {
      shared = true;
      //  arr1[i].data.concat(arr2[j].data);
      var set1 = pushproperties(arr1[i].data, arr2[j].data);
      arr1[i].data = set1;
      arr3.push(arr1[i]);
      break;
    }
  if (!shared) {
    arr3.push(arr1[i]);
    arr3.push(arr2[j]);
  }

}

function pushproperties(set1, set2) {
  var filtered = false;
  set2.forEach(function(item) {
    filtered = set1.every(function(element) {
      return element.id != item.id;

    });
    if (filtered) {
      set1.push(item);
    }

  });

  set1.forEach(function(item) {
    set2.forEach(function(element) {
      if (item.id == element.id) {
        item.data = element.data;
      }

    });


  });

  return set1;

}

console.log(arr3);

希望这能有所帮助

票数 0
EN

Stack Overflow用户

发布于 2016-11-21 11:07:31

这是一个函数,它使用Array.prototype.reduce()递归地合并两个数组。如果遇到具有相同id的项,并且它们有一个data支柱(这是一个数组),则使用逻辑将它们合并。如果data不是数组,则它将被最后一个项覆盖。

代码语言:javascript
复制
function mergeArraysDeep(arr1, arr2) { 
  var unique = arr1.concat(arr2).reduce(function(hash, item) {
    var current = hash[item.id];
    
    if(!current) {
      hash[item.id] = item;
    } else if (Array.isArray(current.data)) {
      current.data = mergeArraysDeep(current.data, item.data);
    } else {
      current.data = item.data;
    }

    return hash;
  }, {});

  return Object.keys(unique).map(function(key) {
    return unique[key];
  });
}

var array1 = [
  {id:"123", data:[{id:"234",data:"hello"},{id:"345",data:"there"},{id:"xyz", data:"yo"}]},
  {id:"456", data:[{id:"34",data:"test"},{id:"45",data:"test2"},{id:"yz", data:"test3"}]},
  {id:"789", data:[{id:"23",data:"aaa"},{id:"34",data:"bbb"},{id:"xy", data:"ccc"}]}
];

var array2 = [
  {id:"456", data:[{id:"45",data:"changed"},{id:"yz", data:"data"}]},
  {id:"789", data:[{id:"456",data:"appended data"}]},
  {id:"890", data:[{id:"456",data:"new data"}]}
];

var result = mergeArraysDeep(array1, array2)

console.log(result);

ES6版本,使用MapMap.prototype.values()阵列扩展

代码语言:javascript
复制
const mergeArraysDeep = (arr1, arr2) => { 
  return [...arr1.concat(arr2).reduce((hash, item) => {
    const current = hash.get(item.id);
    
    if(!current) {
      hash.set(item.id, item);
    } else if (Array.isArray(current.data)) {
      current.data = mergeArraysDeep(current.data, item.data);
    } else {
      current.data = item.data;
    }

    return hash;
  }, new Map()).values()];
}

const array1 = [
  {id:"123", data:[{id:"234",data:"hello"},{id:"345",data:"there"},{id:"xyz", data:"yo"}]},
  {id:"456", data:[{id:"34",data:"test"},{id:"45",data:"test2"},{id:"yz", data:"test3"}]},
  {id:"789", data:[{id:"23",data:"aaa"},{id:"34",data:"bbb"},{id:"xy", data:"ccc"}]}
];

const array2 = [
  {id:"456", data:[{id:"45",data:"changed"},{id:"yz", data:"data"}]},
  {id:"789", data:[{id:"456",data:"appended data"}]},
  {id:"890", data:[{id:"456",data:"new data"}]}
];

const result = mergeArraysDeep(array1, array2)

console.log(result);

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40712399

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档