2017-09-01 73 views
0

反应我有两个数组:如何合并基于属性值的两个数组与ES6

a = [{"sourceId": "1", "targetId": "2", "name": "heats air"} , 
     {"sourceId": "3", "targetId": "4", "name": "power"}] 

b = [{"name": "Hair Dryer", "id": "1"}, 
     {"name": "Heating System", "id": "2"}, 
     {"name": "Mains", "id": "3"}, 
     {"name": "Blower", "id": "4"}] 

如何得到的输出是这样的:

[{"sourceId": "1", "targetId": "2", "name": "heats air", "from": "Hair Dryer", "to": "Heating System"}, 
{"sourceId": "3", "targetId": "4", "name": "power","from": "Mains", "to": "Blower"] 

我想将它们合并基于属性值:数组a的键“sourceId”和“targetId”应该对应于数组b的键“id”。如果一个sourceId与一个id相匹配,那么将该名称的值用键“from”添加到数组a中的对象中;如果一个targetId与一个id相匹配,那么将该名称的值加上“to”键到数组a中的项目。另外,我想知道我是否可以在不使用lodash的情况下做到这一点。 (使用ES6)

+1

目前尚不清楚合并算法应该是为得到合并的对象没有公共属性。你如何确定与什么合并?请描述“以合适的方式”合并算法。而且,你如何确定应该设置什么'from'和'to'? – jfriend00

+0

数组a的键“sourceId”和“targetId”应该对应数组b的键“id”。 – hypha

+0

请编辑您的问题,将合并算法添加到您的问题。同时描述应该如何设置'from'和'to'。评论不应该用于所需的信息 - 该信息应该添加到问题本身。 – jfriend00

回答

1

使用Array#reduce转换b到的id一个Mapname。然后Array#mapa所要求的形式使用Object#assignbMap

const a = [{"sourceId":"1","targetId":"2","name":"heats air"},{"sourceId":"3","targetId":"4","name":"power"}]; 
 

 
const b = [{"name":"Hair Dryer","id":"1"},{"name":"Heating System","id":"2"},{"name":"Mains","id":"3"},{"name":"Blower","id":"4"}]; 
 

 
const bMap = b.reduce((map, item) => map.set(item.id, item.name), new Map); 
 

 
const result = a.map((item) => (Object.assign({ 
 
    from: bMap.get(item.sourceId), 
 
    to: bMap.get(item.targetId) 
 
}, item))); 
 

 
console.log(result);

-1

AB [索引] = Object.assign(一个[索引],B [指数])

+0

这不会产生所需的结果。请注意,结果中添加了新的属性,如“from”和“to”。 – jfriend00

+0

这假设两个阵列的长度和顺序是相同的。 – lux

0

在这里你去。

const a = [{"sourceId": "1", "targetId": "2", "name": "heats air"} , 
 
     {"sourceId": "3", "targetId": "4", "name": "power"}] 
 

 
const b = [{"name": "Hair Dryer", "id": "1"}, 
 
     {"name": "Heating System", "id": "2"}, 
 
     {"name": "Mains", "id": "3"}, 
 
     {"name": "Blower", "id": "4"}] 
 
     
 
const result = a.reduce((arr, curr) => { 
 
    \t const from = b.filter(bObj => { 
 
    \t return bObj.id === curr.sourceId; 
 
    })[0] 
 
    const to = b.filter(bObj => { 
 
    \t return bObj.id === curr.targetId; 
 
    })[0]; 
 
    arr.push({ ...curr, from: from.name, to: to.name }); 
 
    return arr; 
 
}, []); 
 
    
 
console.log(result);