【问题标题】:Merging two arrays on id - map function - Javascript合并 id 上的两个数组 - 映射函数 - Javascript
【发布时间】:2017-07-26 19:22:21
【问题描述】:

我正在尝试合并一个 id (sourceID) 上的两个数组。但做不到。第一个数组是下面的:

eventsToBeInserted = [{sourceID: 1, name: "BettyNansen"}, {sourceID: 2, name: "kongenshave"}]

这是第二个数组:

images = [{sourceID: 1, images: "Bettynansen.jpg"}, {sourceID: 2, name: "kongenshave.jpg"}]

我希望得到以下内容:

events = [{sourceID: 1, name: "BettyNansen", images: "Bettynansen.jpg"}, {sourceID: 2, name: "kongenshave", images: "kongenshave.jpg"}]

这是我的代码:

const eventsToBeInserted = [{
  sourceID: 1,
  name: "BettyNansen"
}, {
  sourceID: 2,
  name: "kongenshave"
}]

const images = [{
  sourceID: 1,
  images: "Bettynansen.jpg"
}, {
  sourceID: 2,
  name: "kongenshave.jpg"
}]

events: !!eventsToBeInserted ? eventsToBeInserted.sourceID.map(sourceID => {
  const event = images.name.find(eventLookup => eventLookup.sourceID === sourceID);
  return [eventsToBeInserted.name, images.name]
}) : []

【问题讨论】:

标签: javascript arrays


【解决方案1】:

基本上你想要的是,对于eventsToBeInserted 中的每个元素,在images 数组中找到属于它的所有图像。

注意:在您的images 数组中,第一个元素具有属性images,第二个元素具有属性name

const images = [{
  sourceID: 1,
  images: "Bettynansen.jpg"
// ^
}, {
  sourceID: 2,
  name: "kongenshave.jpg"
// ^
}]

两者都应该使用name 似乎是合乎逻辑的,所以这就是我下面的示例所假设的。如果这些对象可以同时使用imagesname,那么您应该在检索值时以优先存在的顺序|| 这两个属性。

const eventsToBeInserted=[{sourceID:1,name:"BettyNansen"},{sourceID:2,name:"kongenshave"}],images=[{sourceID:1,name:"Bettynansen.jpg"},{sourceID:2,name:"kongenshave.jpg"}];

console.log(
  eventsToBeInserted.map(
    event => Object.assign({}, event, {
      images: images
        .filter(img => img.sourceID === event.sourceID)
        .map(img => img.name)
    })
  )
)

如果每个对象将始终仅匹配 1 个图像,根据您的示例,您可以在 images 数组上使用 find 而不是 filter

注意:如果您只有一张图片,则将该属性命名为 image 而不是 images 会更有意义。

const eventsToBeInserted=[{sourceID:1,name:"BettyNansen"},{sourceID:2,name:"kongenshave"}],images=[{sourceID:1,name:"Bettynansen.jpg"},{sourceID:2,name:"kongenshave.jpg"}];

console.log(
  eventsToBeInserted.map(
    event => Object.assign({}, event, {
      image: (
        images.find(img => img.sourceID === event.sourceID) || {}
      ).name
    })
  )
)

如果此操作需要多次执行,将images 转换为sourceID: imageName 的哈希会更有效。

const eventsToBeInserted=[{sourceID:1,name:"BettyNansen"},{sourceID:2,name:"kongenshave"}],images=[{sourceID:1,name:"Bettynansen.jpg"},{sourceID:2,name:"kongenshave.jpg"}];

const imagesHash = images.reduce((hash, img) => {
  hash[img.sourceID] = img.name;
  return hash;
}, {});

console.log(
  eventsToBeInserted.map(
    event => Object.assign({}, event, {
      image: imagesHash[event.sourceID]
    })
  )
)

最后,假设您的环境允许,您可以使用object spread 来简化语法:

const eventsToBeInserted=[{sourceID:1,name:"BettyNansen"},{sourceID:2,name:"kongenshave"}],images=[{sourceID:1,name:"Bettynansen.jpg"},{sourceID:2,name:"kongenshave.jpg"}];

const imagesHash = images.reduce((hash, img) => {
  hash[img.sourceID] = img.name;
  return hash;
}, {});

console.log(
  eventsToBeInserted.map(
    event => ({
      ...event,
      image: imagesHash[event.sourceID]
    })
  )
)

【讨论】:

  • 谢谢@nem035。非常感谢详尽而详细的解释!
  • @BjarkeAndersen 没问题,很高兴帮助朋友 :)
猜你喜欢
  • 1970-01-01
  • 2019-02-19
  • 1970-01-01
  • 2021-08-23
  • 2018-01-27
  • 1970-01-01
  • 2022-01-23
  • 1970-01-01
  • 2021-09-23
相关资源
最近更新 更多