将两个对象按键合并为一个,保留重复

时间:2018-01-02 17:47:46

标签: javascript array-merge

所以我一直在寻找解决方案,但似乎无法弄明白。我试图通过匹配companyId将subscriptionArray和userArray合并在一起,但如果公司有多个用户(如companyA),我希望订阅ID重复并为每个用户创建一个具有重复subscriptionId的新对象(请参阅resultArray)。我有一个更大的数据集我正在使用,但最终目标是将每个用户的数组作为与subscriptionId相关联的对象,为多个用户提供多个重复订阅ID。

我能够合并当前的两个,但它不会创建重复的subscriptionId对象,它只是替换了上一个对象。

我不能使用ES6,lodash或JQuery,所以请简单的vanilla JS

var subscriptionArray = [
    {
     "subscriptionId" : 2,
     "CompanyId" : 20, 
    },
    {
     "subscriptionId" : 3,
     "CompanyId" : 30,
    },
    {
     "subscriptionId" : 4,
     "CompanyId" : 40,
    }
]

var userArray = [
   {"FirstName" : "Matt",
    "CompanyId" : 20,
    "CompanyName" : "CompanyA",
   },
   {"FirstName" : "Bob",
    "CompanyId" : 20,
    "CompanyName" : "CompanyA",
   },
   {"FirstName" : "John",
    "CompanyId" : 30,
    "CompanyName" : "CompanyB",
   },
   {"FirstName" : "Tim",
    "CompanyId" : 40,
    "CompanyName" : "CompanyC",
   }
]

var resultArray = [
  {
   "subscriptionId" : 2,
   "FirstName" : "Matt"
   "CompanyId" : 20,
   "CompanyName" : "CompanyA",
  },
  {
   "subscriptionId" : 2,
   "FirstName" : "Bob"
   "CompanyId" : 20,
   "CompanyName" : "CompanyA",
  },
  {
   "subscriptionId" : 3,
   "FirstName" : "John"
   "CompanyId" : 30,
   "CompanyName" : "CompanyB",
  },
  {
   "subscriptionId" : 4,
   "FirstName" : "Tim"
   "CompanyId" : 40,
   "CompanyName" : "CompanyC",
  },

]

2 个答案:

答案 0 :(得分:0)

你真的应该分享你尝试过的和不起作用的东西。这说明使用Object.assign()

相当容易

这是一个小提琴,显示了这个行动https://jsfiddle.net/ysy50edf/1/

让我们看看代码:

userArray.forEach( function(user) {
  subscriptionArray.forEach( function(sub) {
    if( sub.CompanyId == user.CompanyId ){
        var result = Object.assign(user, sub);
      results.push( result );
    }
  });
});

循环每个用户,然后循环遍历订阅以查找匹配的属性。然后创建一个新的结果对象,分配给用户和订阅。这会合并两个对象,然后将结果推送到结果中。

答案 1 :(得分:0)

您可以使用中间结构{[companyId]: items[]}来执行此操作,该结构将是公司ID索引的userArray(并且值是数组,因为多个人可以在同一家公司中)。然后循环到subscriptionArray adn返回一个新的正确值。

var userByCompanyId = userArray.reduce(function (users, item) {
    if (!users[item.CompanyId]) {
        users[item.CompanyId] = [];
    }
    users[item.CompanyId].push(item);
    return users;
}, {});

var subscriptionResultArray = [].concat.apply([], subscriptionArray
    .filter(function (item) {
        return userByCompanyId[item.CompanyId] !== undefined;
    })
    .map(function (item) {
        var subId = item.subscriptionId;
        return userByCompanyId[item.CompanyId].map(function (sub) {
            // deepMerge merge recursively objects, see loadash
            return deepMerge({}, sub, {
                 subscriptionId: subId
            });

        });
    }));

请注意,我改变userArray中的项目,您可以通过在Es6环境中使用Object.assign或编写自己的实现来避免这种情况。