[英]Javascript merge some properties of 2 arrays
我有 2 个 arrays 里面有对象:
names = [
{
"name": "B"
},
{
"name": "C"
},
{
"name": "D"
},
{
"name": "B"
},
{
"name": "A"
}
]
sections = [
{
"id": 3638,
"name": "B",
"type": "PANEL",
"parentSectionId": 3635,
"order": 1,
"page": "595"
},
{
"id": 3658,
"name": "C",
"type": "PANEL",
"parentSectionId": 3635,
"order": 2,
"page": "595"
},
{
"id": 3659,
"name": "D",
"type": "PANEL",
"parentSectionId": 3635,
"order": 3,
"page": "595"
},
{
"id": 3636,
"name": "A",
"type": "PANEL",
"parentSectionId": 3635,
"order": 4,
"page": "595"
},
{
"id": 3661,
"name": "B",
"type": "PANEL",
"parentSectionId": 3635,
"order": 5,
"page": "595"
}
]
我需要在名称数组中合并部分数组的一些属性。 要合并的属性是:id 和 order。
问题出在身份证上。 因为有一个重复的名称:'B' id 被重复。
我尝试了很多东西,但它们失败了,因为在两个重复名称上都放置了相同的ID 3638 :'B'。
这是我得到的错误 output:
section {id: 3638, name: 'B', order: 1, size: undefined}
section {id: 3658, name: 'C', order: 2, size: undefined}
section {id: 3659, name: 'D', order: 3, size: undefined}
section {id: 3638, name: 'B', order: 4, size: undefined}
section {id: 3636, name: 'A', order: 5, size: undefined}
这是我最后一次代码尝试:
const childrens = names.map((c, i) => ({
...c,
id: this.sections.find((s) => s.name === c.name).id,
order: i + 1,
}));
这是我需要的正确且最终的 OUTPUT:
[
{
"name": "B",
"order": 1,
"id": 3638
},
{
"name": "C",
"order": 2,
"id": 3658
},
{
"name": "D",
"order": 3,
"id": 3659
},
{
"name": "B",
"order": 4,
"id": 3661
},
{
"name": "A",
"order": 5,
"id": 3636
}
]
如您所见,第二个 B 排在第 4 位,顺序为:4,id:3661。
我认为你的方向是正确的
对于完全合并,使用:
let children = names.map((name, index) => {
return({
order: index +1,
name: name.name,
...sections[index]
})
})
对于部分合并:
let children = names.map((name, index) => {
return({
name: name.name,
order: index+1,
id: sections[index].id
})
})
我认为您不需要 the.find() 并且只使用索引
据我了解,此代码将保留重复names
的顺序(这是概念证明的原始版本)
merged = []
visited = []
for (let i=0; i<names.length; i++) {
for (let j=0; j<sections.length; j++) {
if ((names[i].name === sections[j].name) && !visited.find(e => e === sections[j].id) ) {
const obj = {...names[i]}
obj['order'] = sections[j].order
obj['id'] = sections[j].id
merged.push(obj)
visited.push(sections[j].id)
//continue
break
}
}
}
console.log(merged)
output:
[
{ name: 'B', order: 1, id: 3638 },
{ name: 'C', order: 2, id: 3658 },
{ name: 'D', order: 3, id: 3659 },
{ name: 'B', order: 5, id: 3661 },
{ name: 'A', order: 4, id: 3636 }
]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.