2017-07-26 104 views
1

我想在一个id(sourceID)上合并两个数组。但是没有这样做。第一个数组是下面的一个:在id映射函数上合并两个数组 - Javascript

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] 
 
}) : []

+0

链接:https://开头计算器。 com/questions/35903850/combine-json-arrays-by-key-javascript –

回答

3

基本上你想要的是,对于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 
 
    }) 
 
) 
 
)

如果此操作需要发生很多次,转换imagessourceID: 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] 
 
    }) 
 
) 
 
)

+0

谢谢@ nem035。真正感谢彻底和详细的解释! –

+0

@Bjarke安徒生没问题,很高兴帮助阿米戈:) – nem035