【问题标题】:Merging parts of JSON objects in an array将部分 JSON 对象合并到一个数组中
【发布时间】:2020-04-22 22:05:20
【问题描述】:

在 javascript(在 nodejs 上运行)中是否有一种简单的方法来合并数组中对象的各种属性?我知道我可以使用一些 for 循环等来做到这一点,但想知道是否有更简单的方法。我的对象数组是这样的 -

 [
  {
    "asin": "123456",
    "isbn": "09876543",
    "title": "Joe bloggs",
    "country": "us",
    "published_date": "2019-07-30",
    "AmazonProductPageInfo": {
      "id": 1108,
      "title_asin": "123456",
      "country": "us",
      "date_of_extraction": "2020-07-04"
    },
    "AmazonCategoryRank": {
      "category_name": "Tom",
      "category_rank": 78,
      "date_of_extraction": "2020-07-04"
    }
  },
  {
    "asin": "123456",
    "isbn": "09876543",
    "title": "Joe bloggs",
    "country": "us",
    "published_date": "2019-07-30",
    "AmazonProductPageInfo": {
      "id": 1108,
      "title_asin": "123456",
      "country": "us",
      "date_of_extraction": "2020-07-04"
    },
    "AmazonCategoryRank": {
      "category_name": "Dick",
      "category_rank": 103,
      "date_of_extraction": "2020-07-04"
    }
  },
  {
    "asin": "123456",
    "isbn": "09876543",
    "title": "Joe bloggs",
    "country": "us",
    "published_date": "2019-07-30",
    "AmazonProductPageInfo": {
      "id": 1108,
      "title_asin": "123456",
      "country": "us",
      "date_of_extraction": "2020-07-04"
    },
    "AmazonCategoryRank": {
      "category_name": "Harry",
      "category_rank": 267,
      "date_of_extraction": "2020-07-04"
    }
  },
  {
    "asin": "123456",
    "isbn": "09876543",
    "title": "Joe bloggs",
    "country": "us",
    "published_date": "2019-07-30",
    "AmazonProductPageInfo": {
      "id": 1108,
      "title_asin": "123456",
      "country": "us",
      "date_of_extraction": "2020-04-20"
    },
    "AmazonCategoryRank": {
      "category_name": "Tom",
      "category_rank": 42,
      "date_of_extraction": "2020-04-20"
    }
  },
  {
    "asin": "123456",
    "isbn": "09876543",
    "title": "Joe bloggs",
    "country": "us",
    "published_date": "2019-07-30",
    "AmazonProductPageInfo": {
       "id": 1108,
      "title_asin": "123456",
      "country": "us",
      "date_of_extraction": "2020-04-20"
    },
    "AmazonCategoryRank": {
      "category_name": "Dick",
      "category_rank": 60,
      "date_of_extraction": "2020-04-20"
    }
  },
  {
    "asin": "123456",
    "isbn": "09876543",
    "title": "Joe bloggs",
    "country": "us",
    "published_date": "2019-07-30",
    "AmazonProductPageInfo": {
       "id": 1108,
      "title_asin": "123456",
      "country": "us",
      "date_of_extraction": "2020-04-20"
    },
    "AmazonCategoryRank": {
      "category_name": "Harry",
      "category_rank": 132,
      "date_of_extraction": "2020-04-20"
    }
  }
]

我希望它们根据 date_of_extraction 像这样合并

[
  {
    "asin": "123456",
    "isbn": "09876543",
    "title": "Joe bloggs",
    "country": "us",
    "published_date": "2019-07-30",
    "AmazonProductPageInfo": {
      "id": 1108,
      "title_asin": "123456",
      "country": "us",
      "date_of_extraction": "2020-07-04"
    },
    "AmazonCategoryRank":[
      {
        "category_name": "Tom",
        "category_rank": 78,
        "date_of_extraction": "2020-07-04"
      },
      {
        "category_name": "Dick",
        "category_rank": 103,
        "date_of_extraction": "2020-07-04"
      },
      {
        "category_name": "Harry",
        "category_rank": 267,
        "date_of_extraction": "2020-07-04"
      }
    ]
  },

  {
    "asin": "123456",
    "isbn": "09876543",
    "title": "Joe bloggs",
    "country": "us",
    "published_date": "2019-07-30",
    "AmazonProductPageInfo": {
      "id": 1108,
      "title_asin": "123456",
      "country": "us",
      "date_of_extraction": "2020-04-20"
    },
    "AmazonCategoryRank": [
      {
        "category_name": "Tom",
        "category_rank": 42,
        "date_of_extraction": "2020-04-20"
      },
      {
        "category_name": "Dick",
        "category_rank": 60,
        "date_of_extraction": "2020-04-20"
      },
      {
        "category_name": "Harry",
        "category_rank": 132,
        "date_of_extraction": "2020-04-20"
      }
    ]
  }
]

【问题讨论】:

  • 为什么要投反对票?这是一个合法的问题,有适当的解释,而且所有......愿意解释吗?

标签: javascript node.js ecmascript-6


【解决方案1】:

有一个很好的 npm 包,叫做deepmerge,看看它可能会解决你的问题。

【讨论】:

  • 谢谢哈迪,但这并不是我所需要的。我试过了,它似乎融合了一切,错过了很多我需要的东西。
【解决方案2】:

您可以通过循环在代码中执行此操作,当然也可以在代码中使用诸如Array.prototype.reduce 之类的函数。

如果您正在寻找一种完全不同的方式,数据库也非常擅长对数据进行分组。我正在使用 mongodb-memory-server 做类似的事情,我正在制作一个临时集合,然后将大量原始数据流式传输到其中,然后使用 mongo 聚合管道来完成转换工作。

在这种情况下,假设您将示例记录流式传输到集合中,您的查询可能如下所示:

db.test.aggregate([
  {
    $group: {
      _id: "$AmazonProductPageInfo.date_of_extraction",
      asin: { $first: "$asin" },
      isbn: { $first: "$isbn" },
      title: { $first: "$title" }, 
      country: { $first: "$country" },
      published_date: { $first: "$published_date" },
      AmazonProductPageInfo: { $first: "$AmazonProductPageInfo" },
      AmazonCategoryRank: { $push: "$AmazonCategoryRank" }, // $push here
    }
  }
])

您使用$first 为组的每个字段选择第一个标量值,假设它们都相同,并使用$push 来表示每个组不同的类别排名对象。这应该会给你想要的结果。

然后,您可以使用游标对它们进行迭代,或者在同一管道中进行进一步的转换或聚合。

【讨论】:

  • 谢谢贾斯汀,我会试试你的方法。基本上,我使用 Sequelize ORM 从数据库中获取这些数据,但我想我没有正确地进行分组。让我试试这个,看看我能到达哪里。
猜你喜欢
  • 2017-12-13
  • 2012-07-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-27
  • 1970-01-01
  • 2023-01-11
  • 1970-01-01
相关资源
最近更新 更多