Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/401.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 基于键将一个JSON数组中的值合并到另一个数组中相应的JSON中_Javascript_Arrays_Json_Array Merge - Fatal编程技术网

Javascript 基于键将一个JSON数组中的值合并到另一个数组中相应的JSON中

Javascript 基于键将一个JSON数组中的值合并到另一个数组中相应的JSON中,javascript,arrays,json,array-merge,Javascript,Arrays,Json,Array Merge,我有两个JSON对象数组。一个有承包商详细信息,另一个有项目。两者都有一个公共字段用户id 我想要一个对象的结果数组,这样每个承包商也有一个活动项目的数组。例如: arr1 = [{ name: 'Contractor A', user_id: 3, mobile_number: '9999999999', active_projects: [] }, { name: 'Contractor B', user_id: 6, mobile_n

我有两个JSON对象数组。一个有承包商详细信息,另一个有项目。两者都有一个公共字段用户id

我想要一个对象的结果数组,这样每个承包商也有一个活动项目的数组。例如:

arr1 = [{
    name: 'Contractor A',
    user_id: 3,
    mobile_number: '9999999999',
    active_projects: []
},
{
    name: 'Contractor B',
    user_id: 6,
    mobile_number: '9999999999',
    active_projects: []
}]

arr2 = [{
    user_id: 3, project_name: 'Project A'
},
{
    user_id: 3, project_name: 'Project B'
},
{
    user_id: 6, project_name: 'Project C'
}]

最终阵列应为:

arr1 = [{
    name: 'Contractor A',
    user_id: 3,
    mobile_number: '9999999999',
    active_projects: ['Project A', 'Project B']
},
{
    name: 'Contractor B',
    user_id: 6,
    mobile_number: '9999999999',
    active_projects: ['Project C']
}]

实现这一点的最佳/最干净的方法是什么?

您可以使用
forEach
迭代
arr2
&内部回调使用
findIndex
arr1
中查找对象的索引,该对象的
用户id
与迭代对象的
用户id
匹配。然后使用
索引
填充第一个数组中的值

让arr1=[{
名称:“承包商A”,
用户id:3,
手机号码:“9999999999”,
活动项目:[]
},
{
名称:“承包商B”,
用户id:6,
手机号码:“9999999999”,
活动项目:[]
}
]
设arr2=[{
用户id:3,
项目名称:“项目A”
},
{
用户id:3,
项目名称:“项目B”
},
{
用户id:6,
项目名称:“项目C”
}
];
arr2.forEach((项目)=>{
const findIndexArr1=arr1.findIndex(elem=>elem.user\u id==item.user\u id);
如果(findIndexArr1!=-1){
arr1[findIndexArr1]。活动项目。推送(项。项目名称)
}
});

console.log(arr1)
您可以使用
map
执行此操作:

var arr1=[{name:'承包商A',用户id:3,手机号码:'9999999',活动项目:[]},{name:'承包商B',用户id:6,手机号码:'9999999',活动项目:[]},
arr2=[{user_id:3,project_name:'project A'},{user_id:3,project_name:'project B'},{user_id:6,project_name:'project C'}];
var result=arr1.map({active_projects,…rest})=>({…rest,active_projects:arr2.filter(k=>k.user_id==rest.user_id).map(name=>name.project_name)});

控制台日志(结果)您也可以为

for(arr1中的i){
对于(arr2中的j){
if(arr1[i].user\u id==arr2[j].user\u id){
arr1[i].活动项目.push(arr2[j].项目名称)
}
}
}

您可以按
用户id
项目名称
进行分组,然后只需
映射
您的
arr1

const grouped = arr2.reduce((a, {user_id, project_name}) => {
    a[user_id] = a[user_id] || [];
    a[user_id].push(project_name);
    return a;
},{})

arr1 = arr1.map(({user_id, active_projects, ...rest}) => ({user_id, 
    active_projects: grouped[user_id], ...rest}));
例如:

arr1=[{
名称:“承包商A”,
用户id:3,
手机号码:“9999999999”,
活动项目:[]
},
{
名称:“承包商B”,
用户id:6,
手机号码:“9999999999”,
活动项目:[]
}]
arr2=[{
用户id:3,项目名称:“项目A”
},
{
用户id:3,项目名称:“项目B”
},
{
用户id:6,项目名称:“项目C”
}]
const group=arr2.reduce((a,{user\u id,project\u name})=>{
[user_id]=一个[user_id]| |[];
[user\u id].push(项目名称);
返回a;
},{})
arr1=arr1.map({user_id,active_projects,…rest})=>({user_id,active_projects:grouped[user_id],…rest}));
console.log(arr1)