繁体   English   中英

Javascript 合并 2 个 arrays 的一些属性

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM