Javascript 通过基于某些条件合并对象数组来创建新数组

Javascript 通过基于某些条件合并对象数组来创建新数组,javascript,ecmascript-6,Javascript,Ecmascript 6,我有两个对象数组 const array1=[ {type:'A',name:'word1'}, {type:'B',name:'word2'}, {type:'C',name:'word3'}, {type:'D',name:'word4'}, {type:'E',name:'word5'}, {type:'F',name:'word6'}, ] const array2=[ {id:1,text:'text1',type:A}, {id:2,text:'text2',type:B}, {i

我有两个对象数组

const array1=[
{type:'A',name:'word1'},
{type:'B',name:'word2'},
{type:'C',name:'word3'},
{type:'D',name:'word4'},
{type:'E',name:'word5'},
{type:'F',name:'word6'},
]

const array2=[
{id:1,text:'text1',type:A},
{id:2,text:'text2',type:B},
{id:3,text:'text3',type:C},
{id:4,text:'text4',type:D},
{id:5,text:'text5',type:D},
{id:6,text:'text6',type:E},
{id:7,text:'text7',type:E},
{id:8,text:'text8',type:B},
]
有些类型在数组1中,但不在数组2中。我想用以下方式显示新数组:-

const newArray=[
{id:1,text:'text1',type:A,name:'word1'},
{id:2,text:'text2',type:B,name:'word2'},
{id:3,text:'text3',type:C,name:'word3'},
{id:4,text:'text4',type:D,name:'word4'},
{id:5,text:'text5',type:D,name:'word4'},
{id:6,text:'text6',type:E,name:'word5'},
{id:7,text:'text7',type:E,name:'word5'},
{id:8,text:'text8',type:B,name:'word2'},
]
我试过这样做:-

var newArray=[],
newArray=array1.map(x => Object.assign(x, array2.filter(y => y.type == x.type)));

但是我没有得到所需格式的输出。

您可以将
数组1
转换为一个由类型键入的数组,并为其值存储
名称。然后,您可以使用
array2
根据
Map

const数组1=[{type:'A',name:'word1'},{type:'B',name:'word2'},{type:'C',name:'word3'},{type:'D',name:'word4'},{type:'E',name:'word5'},{type:'F',name:'word6'},];
const array2=[{id:1,text:'text1',type:'A'},{id:2,text:'text2',type:'B'},{id:3,text:'text3',type:'C'},{id:4,text:'text4',type:'D'},{id:5,text:'text5',type:'D'},{id:6,text:'E'},{id:7,text:'7',type:'E'},{id:8,text:'B'};
consttypemap=newmap(array1.Map({type,name})=>[type,name]);
const newArr=array2.map(o=>({…o,名称:typeMap.get(o.type)}));
控制台日志(newArr)尝试:


最有效的方法是从Array1中创建一个对象映射,以便可以在固定时间内进行搜索。Post可以映射到数组,并使用扩展语法返回更新的objected

const数组1=[
{类型:'A',名称:'word1'},
{类型:'B',名称:'word2'},
{类型:'C',名称:'word3'},
{类型:'D',名称:'word4'},
{类型:'E',名称:'word5'},
{类型:'F',名称:'word6'},
]
常数阵列2=[
{id:1,text:'text1',type:'A'},
{id:2,text:'text2',type:'B'},
{id:3,text:'text3',type:'C'},
{id:4,text:'text4',type:'D'},
{id:5,text:'text5',type:'D'},
{id:6,text:'text6',type:'E'},
{id:7,text:'text7',type:'E'},
{id:8,text:'text8',type:'B'},
]
const map=Object.assign({},…array1.map(item=>({[item.type]:item.name})))
常量res=array2.map(obj=>({
…obj,
名称:映射[对象类型]
}))

控制台日志(res)
您必须映射到
array2
以根据两个数组之间的
类型
键比较返回一个新的对象数组,如下所示:

const数组1=[
{类型:'A',名称:'word1'},
{类型:'B',名称:'word2'},
{类型:'C',名称:'word3'},
{类型:'D',名称:'word4'},
{类型:'E',名称:'word5'},
{类型:'F',名称:'word6'},
]
常数阵列2=[
{id:1,text:'text1',type:'A'},
{id:2,text:'text2',type:'B'},
{id:3,text:'text3',type:'C'},
{id:4,text:'text4',type:'D'},
{id:5,text:'text5',type:'D'},
{id:6,text:'text6',type:'E'},
{id:7,text:'text7',type:'E'},
{id:8,text:'text8',type:'B'},
]
const newArray=array2.map(x=>Object.assign(x,{name:array1.find(y=>y.type==x.type.name}));

console.log(newArray)//test
首先,您在array2中的
类型应该是
字符串。
否则它应该引用一个变量

当我使用
map
find
数组方法时。 您可以通过以下方式改进您的解决方案:

constnewarr=array2.map(x=>({…x,名称:array1.find(y=>y.type==x.type).name}));

以下是我对
forEach
循环的尝试

var数组1=[
{类型:'A',名称:'word1'},
{类型:'B',名称:'word2'},
{类型:'C',名称:'word3'},
{类型:'D',名称:'word4'},
{类型:'E',名称:'word5'},
{类型:'F',名称:'word6'},
]
var array2=[
{id:1,text:'text1',type:'A'},
{id:2,text:'text2',type:'B'},
{id:3,text:'text3',type:'C'},
{id:4,text:'text4',type:'D'},
{id:5,text:'text5',type:'D'},
{id:6,text:'text6',type:'E'},
{id:7,text:'text7',type:'E'},
{id:8,text:'text8',type:'B'},
]
数组2.forEach((v)=>{
type=array1.find(({type})=>type==v.type);
v=对象。分配(v,类型);
});

控制台日志(array2)
首先,由于新数组基于array2,因此需要使用array2中的
array2.map()
。array2中的
type
是字符串吗?看起来需要这样:
const newArray=array2.map(x=>Object.assign(x,{name:array1.find(y=>y.type==x.type).name})您可以编辑您的问题吗?
const array1=[
{type:'A',name:'word1'},
{type:'B',name:'word2'},
{type:'C',name:'word3'},
{type:'D',name:'word4'},
{type:'E',name:'word5'},
{type:'F',name:'word6'},
]

const array2=[
{id:1,text:'text1',type:'A'},
{id:2,text:'text2',type:'B'},
{id:3,text:'text3',type:'C'},
{id:4,text:'text4',type:'D'},
{id:5,text:'text5',type:'D'},
{id:6,text:'text6',type:'E'},
{id:7,text:'text7',type:'E'},
{id:8,text:'text8',type:'B'},
]

const a = array2.map(arr => {
    const {name} = array1.filter(iArr => iArr.type === arr.type)[0];
    return {...arr, name} 
})