我有两个不同的对象数组,需要分别映射到我定义的key:value对。映射时,应为每个对象分配一个顺序索引。然后,我需要获取每个映射的数组并将它们连接起来。
这是我到目前为止尝试过的。它可以工作,但是我认为可能有更有效或更干净的方法:
const mapPosts = () => {
let index = 0
const mappedPostsA = postsA.map(post => {
index++
return {
id: index,
provider: 'Wordpress',
post_id: postA.id,
title: postA.title,
body: postA.body_html
}
})
const mappedPostsB = postsB.map(post => {
index++
return {
id: index,
provider: 'Blogspot',
post_id: postB.id,
title: postB.title,
body: postB.description
}
})
const mappedPosts = [...mappedPostsA, ...mappedPostsB])
}
答案 0 :(得分:4)
您可以将索引偏移postsA
的长度,因为您知道postsB
总是紧随其后。
const mapPosts = (postsA, postsB) => {
return [
...postsA.map((post, index) => ({
id: index,
provider: 'Wordpress',
post_id: post.id,
title: post.title,
body: post.body_html
}))
...postsB.map((product, index) => ({
id: index + postsA.length,
provider: 'Blogspot',
post_id: product.id,
title: product.title,
body: product.description
}))
];
};
由于您在最初的问题中使用了扩展语法,因此我使用了扩展语法,您可以改用mappedA.concat(mappedB)
之类的东西,但这主要是优先考虑的问题。
答案 1 :(得分:0)
如果您担心效率,并且有很多对象,则可能要考虑使用Map而不是普通对象。地图是专门为有效处理键值对而定制的。您可能会获得稍微的性能提升,或者至少是稍微易读的代码。
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map
答案 2 :(得分:0)
要删除重复的代码,我可能会这样做
const mappedPostsA = postsA.map(post => ({post, provider: 'Wordpress', body: post.body_html}));
const mappedPostsB = postsB.map(post => ({post, provider: 'Blogspot', body: post.description}));
const mappedPosts = [].concat(mappedPostsA, mappedPostsB).map(({post, provider, body}, index) => ({
id: index,
provider,
post_id: post.id,
title: post.title,
body,
}));