Объединение частей JSON объектов в массиве - PullRequest
0 голосов
/ 22 апреля 2020

Есть ли простой способ в javascript (работающий на nodejs) объединять различные атрибуты объекта в массиве? Я знаю, что могу сделать это, используя некоторые for loop & et c, но мне было интересно, есть ли более простой способ. Мой массив объектов выглядит так -

 [
  {
    "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"
      }
    ]
  }
]

Ответы [ 2 ]

0 голосов
/ 22 апреля 2020

Вы можете сделать это в коде с помощью циклов или просто с помощью таких функций, как Array.prototype.reduce в коде, конечно.

Если вы ищете полностью По-другому, базы данных также неплохо группируют данные. Я делаю нечто подобное, используя mongodb-memory-server , где я делаю временную коллекцию, затем направляю в нее большой набор необработанных данных, а затем использую агрегатные конвейеры mon go для выполнения работы по преобразованию.

В этом случае для вас, при условии, что вы отправляете потоковые записи в коллекцию, ваш запрос может выглядеть примерно так:

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 для объектов ранга категории, которые различны для каждой группы. Это должно дать вам желаемые результаты.

Затем вы можете использовать курсор для перебора всех их или выполнения дальнейших преобразований или агрегаций в том же конвейере.

0 голосов
/ 22 апреля 2020

Существует хороший npm пакет под названием deepmerge , который может решить вашу проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...