Javascript 如何将两个数组合并为一个嵌套数组?

Javascript 如何将两个数组合并为一个嵌套数组?,javascript,arrays,Javascript,Arrays,一点背景:在一次技术面试中被要求回答这个问题,我不能,现在我想提高,但找不到回答的逻辑 ## CASE 1 ## Given Input: const profiles = ["Bill", "Steve", "Zuck"] const skills = [["Digital Marketing","SEO","UI/UX"], [&qu

一点背景:在一次技术面试中被要求回答这个问题,我不能,现在我想提高,但找不到回答的逻辑

## CASE 1 ##

Given Input:

const profiles = ["Bill", "Steve", "Zuck"]
const skills = 
        [["Digital Marketing","SEO","UI/UX"], 
        ["Accounting","Digital Marketing","Employer Branding"], 
        ["Accounting","UI/UX"]]


Expected Output:

    [[["Accounting"],["Steve","Zuck"]], 
    [["Digital Marketing"],["Bill","Steve"]], 
    [["Employer Branding"],["Steve"]], 
    [["SEO"],["Bill"]], 
    [["UI/UX"],["Bill","Zuck"]]]

多谢各位

也许有一种更优雅的方法可以做到这一点,但它似乎做到了

代码中的注释来解释它所做的事情

功能添加技能(技能组、个人资料、技能){
为了(让技能中的技能){
//将当前技能的配置文件添加到阵列中,或添加新技能
//如果这是我们第一次遇到它,请输入
技能组[技能]=[
…(技能组[技能]| |[]),
轮廓
];
}
}
功能组技能(配置文件、技能){
//从技能名称映射到该技能中的配置文件
设skillGroups={};
对于(设i=0;il.localeCompare(r));
//将技能名称放入数组并返回
返回条目.map([skill,profiles])=>[
[技能],个人资料
]);
}
chai.expect(团体技能)(
[“比尔”、“史蒂夫”、“祖克”][
[“数字营销”、“搜索引擎优化”、“用户界面/用户体验”],
[“会计”、“数字营销”、“雇主品牌”],
[“会计”、“用户界面/用户体验”]
]
)).to.deep.equal([
[
[“会计”],
[“史蒂夫”,“祖克”]
],
[
[“数字营销”],
[“比尔”、“史蒂夫”]
],
[
[“雇主品牌”],
[“史蒂夫”]
],
[
[“搜索引擎优化”],
[“法案”]
],
[
[“用户界面/用户体验”],
[“比尔”,“祖克”]
]
]);
chai.expect(团体技能)(
[“第一”、“第四”、“第二”、“第三”][
[“一”、“三”、“二”],
[“一”、“一三”、“一二”],
[“一二”、“一二三”、“二”],
[“一”、“一三”、“一二”、“一二三”、“三”、“二”]
]
)).to.deep.equal([
[
[“一”],
[“第一”、“第四”、“第三”]
],
[
[“一三”],
[“第四”、“第三”]
],
[
[“一二”],
[“第四”、“第二”、“第三”]
],
[
[“一二三”],
[“第二”、“第三”]
],
[
[“三”],
[“第一”、“第三”]
],
[
[“两个”],
[“第一”、“第二”、“第三”]
]
]);
log('all tests passed!')

以下是一种可能有点昂贵的方法,但它会输出预期的结果

对于第二个示例,此代码仍然有效,您可能需要考虑将变量重命名为更通用的名称

const profiles=[“比尔”、“史蒂夫”、“祖克”];
康斯特技能=[
[“数字营销”、“搜索引擎优化”、“用户界面/用户体验”],
[“会计”、“数字营销”、“雇主品牌”],
[“会计”、“用户界面/用户体验”]
];
//根据技能计算不同的技能集
const distinctSkills=技能。减少((acc,cur)=>(
acc.concat(当前过滤器((v)=>(!acc.includes(v)))
),[]).sort();
const result=distinctSkill.map((distinctSkill)=>{
const people=[];
//对于每种不同的技能,构建正确的人员阵列
//基于技能和个人资料
技能。forEach((技能集,索引)=>{
if(技能集包括(distinctSkill)){
推送(配置文件[索引]);
}
});
返回[[distinctSkill]].concat([people]);
});

控制台日志(结果)您可以首先将所有技能名称收集到一个地图中,由这些名称键入,每个名称都有一个关联的空数组作为值。然后再次迭代该数据,将相应的名称推送到这些数组中。然后将这些数组从地图中取出,并在其自身的数组中以技能名称作为前缀。可以选择按技能排序

const profiles=[“比尔”、“史蒂夫”、“祖克”];
const skills=[“数字营销”、“搜索引擎优化”、“用户界面/用户体验”]、[“会计”、“数字营销”、“雇主品牌”]、[“会计”、“用户界面/用户体验”];
让map=newmap(skills.flatMap(row=>row.map(s=>s,[]));
skills.forEach((row,i)=>row.forEach(s=>map.get.push(profiles[i]));
让result=Array.from(map.entries(),([k,v])=>[k],v])
.sort((a,b)=>a[0][0].localeCompare(b[0][0]);
控制台日志(结果)
const profiles=[“比尔”、“史蒂夫”、“祖克”];
康斯特技能=[
[“数字营销”、“搜索引擎优化”、“用户界面/用户体验”],
[“会计”、“数字营销”、“雇主品牌”],
[“会计”、“用户界面/用户体验”]
];
const combine=(配置文件、技能)=>{
const indexMap={};
常量输出=[];
设指数=0;
//创建技能数组和跟踪索引
技能。forEach(arr=>{
arr.forEach(技能=>{
如果(!indexMap[skill]){
indexMap[skill]=index.toString();
输出推送([
[技能],
[]
])
索引++;
}
})
})
//使用indexmap作为参考填充辅助阵列
profiles.forEach((profile,index)=>{
技能[索引].forEach(技能=>{
让我=索引映射[技能];
输出[i][1]。推送(配置文件);
})
})
//按字母顺序排列名称
output.forEach(output=>{
输出[1]。排序((a,b)=>a[0]>b[0]?1:-1);
})
////不按字母顺序对技能进行排序
返回输出.sort((a,b)=>a[0]>b[0]?1:-1);
}

console.log(合并(个人资料、技能))
您是如何确定Steve和Zuck从事会计工作的?他们是否给出了遵循的模式?发现很难理解这种关系。@GhassenLouhaichi两个输入数组之间有一对一的对应关系。比尔从事数字营销、搜索引擎优化和用户界面/用户体验,史蒂夫从事会计、数字营销和品牌推广等领域。@JLRishe我现在明白了,这是一种幻觉,让人印象深刻@Muhamad Hafiz你能告诉我们你到目前为止尝试了什么吗?如果我错了,请纠正我,但我认为如果一种技能是另一种技能的子技能(“营销”和“数字营销”),这可能会产生不正确的结果。数组有一个.includes()方法,那么为什么不直接使用它呢?感谢您对@GhassenLouhaichi的洞察!虽然其他答案都很好,但我发现你的答案对我来说是“点击”最快的:)
## CASE 2 ##

Given Input:

const profiles= ["First", "Fourth", "Second", "Third"]

const skills =
        [["One","Three","Two"], 
        ["One","One three","One two"], 
        ["One two","One two three","Two"], 
        ["One","One three","One two","One two three","Three","Two"]]

Expected Output:
    [[["One"],["First","Fourth","Third"]], 
    [["One three"],["Fourth","Third"]], 
    [["One two"],["Fourth","Second","Third"]], 
    [["One two three"],["Second","Third"]], 
    [["Three"],["First","Third"]], 
    [["Two"],["First","Second","Third"]]]