所以我一直在寻找解决方案,但似乎无法弄明白。我试图通过匹配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",
},
]
答案 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
或编写自己的实现来避免这种情况。