Javascript 如何映射两个对象数组,连接它们,并有效地添加索引
我有两个不同的对象数组,需要分别映射到我定义的键:值对。映射时,应为每个对象指定一个顺序索引。然后,我需要获取每个映射数组并连接它们 这就是我到目前为止所尝试的。这是可行的,但我认为可能有一种更有效或更干净的方法:Javascript 如何映射两个对象数组,连接它们,并有效地添加索引,javascript,arrays,Javascript,Arrays,我有两个不同的对象数组,需要分别映射到我定义的键:值对。映射时,应为每个对象指定一个顺序索引。然后,我需要获取每个映射数组并连接它们 这就是我到目前为止所尝试的。这是可行的,但我认为可能有一种更有效或更干净的方法: const mapPosts = () => { let index = 0 const mappedPostsA = postsA.map(post => { index++ return {
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])
}
您可以将索引偏移
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)
的东西,但这主要是一个偏好问题。您可以用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
}))
];
};
我使用了扩展语法,因为你在原来的问题中使用了它,你可以使用诸如“代码> MajdAd.CONTAT(MAPDDB)”之类的东西,但是这主要是一个偏好问题。
如果你关心效率,如果你有很多对象,你可能想考虑使用一个MAP而不是一个普通的对象。映射是专门为有效处理键值对而定制的。您可能会获得一点性能提升,或者至少会获得一点可读性更强的代码
如果你关心效率,如果你有很多对象,你可能想考虑使用一个映射而不是一个纯对象。映射是专门为有效处理键值对而定制的。您可能会获得一点性能提升,或者至少会获得一点可读性更强的代码
要删除代码重复,我可能会这样做
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,
}));
为了消除代码重复,我可能会这样做
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,
}));
那是打字错误吗?哪里定义了
postA
和postB
?为什么要在每个对象上使用相同的属性?我想你是想在这些映射函数中使用post
和product
,而不是postA
和postB
@dandavis,这不是打字错误。它们的定义在前面,但它们的定义并不重要。如果你仔细看,它们不是相同的属性。每个对象都来自不同的提供者。例如,postA的body_html映射到body,而postB的description映射到body。@Ace第二个映射上的拼写错误已经更正了。谢谢那是打字错误吗?哪里定义了postA
和postB
?为什么要在每个对象上使用相同的属性?我想你是想在这些映射函数中使用post
和product
,而不是postA
和postB
@dandavis,这不是打字错误。它们的定义在前面,但它们的定义并不重要。如果你仔细看,它们不是相同的属性。每个对象都来自不同的提供者。例如,postA的body_html映射到body,而postB的description映射到body。@Ace第二个映射上的拼写错误已经更正了。谢谢我认为将postsA和postsB作为参数传递也是一个好主意,这样函数就不会有副作用,而是根据它接收到的数据进行操作。同意。问题不在于此,似乎是从外部环境得到的,但将其更改为参数值可能是个好主意。@NicoDiz这确实是个好主意;谢谢你的帮助!我认为将postsA和postsB作为参数传递也是一个好主意,这样函数就不会有副作用,而是根据它接收到的数据进行操作。同意。问题不在于此,似乎是从外部环境得到的,但将其更改为参数值可能是个好主意。@NicoDiz这确实是个好主意;谢谢你的帮助!谢谢这确实是个好主意,但我的对象比相似的对象有更多不同的字段。我应该指定的,谢谢!这确实是个好主意,但我的对象比相似的对象有更多不同的字段。我应该说明的。