Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/wordpress/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何映射两个对象数组,连接它们,并有效地添加索引_Javascript_Arrays - Fatal编程技术网

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这确实是个好主意;谢谢你的帮助!谢谢这确实是个好主意,但我的对象比相似的对象有更多不同的字段。我应该指定的,谢谢!这确实是个好主意,但我的对象比相似的对象有更多不同的字段。我应该说明的。