Объединение двух массивов по уникальному идентификатору - PullRequest
0 голосов
/ 09 мая 2019

Я ищу несколько советов о том, как улучшить этот метод, поскольку мне не нравится обходной путь.

У меня есть два массива объектов с Json.

Первый имеет вседат в диапазоне дат, второй список происходит из SQL-запроса, в котором могут отсутствовать несколько месяцев.

Желаемым результатом должен быть список со всеми месяцами в порядке с помощью метода countCount, однако, когда язагрузите их в нижеприведенную функцию. Я пропускаю Математический счет по месяцам, которых в списке не было.

Я думаю, что мне просто не хватает кода, но я не совсем уверен, чтоотсюда и сюда.

У меня есть работа, которая есть в JSFiddle, но я бы предпочел более четкий код.

let x = [{labelDate: "Jun 2013"},
{labelDate: "Jul 2013"},
{labelDate: "Aug 2013"},
{labelDate: "Sep 2013"},
{labelDate: "Oct 2013"},
{labelDate: "Nov 2013"},
{labelDate: "Dec 2013"},
{labelDate: "Jan 2014"},
{labelDate: "Feb 2014"},
{labelDate: "Mar 2014"},
{labelDate: "Apr 2014"},
{labelDate: "May 2014"}];


let y = [{labelDate: "Jun 2013", matterCount: "1"},
{labelDate: "Jul 2013", matterCount: "2"},
{labelDate: "Aug 2013", matterCount: "2"},
{labelDate: "Sep 2013", matterCount: "10"},
{labelDate: "Oct 2013", matterCount: "1"},
{labelDate: "Nov 2013", matterCount: "1"},
{labelDate: "Feb 2014", matterCount: "1"},
{labelDate: "Apr 2014", matterCount: "17"},
{labelDate: "May 2014", matterCount: "21"}];

const merge = (x, y) =>
            x.map(xItem => ({
              ...y.find(yItem => yItem.labelDate === xItem.labelDate && Item),
              ...xItem
            }));

Actual outcome 
merge = [{labelDate: "Jun 2013", matterCount: "1"},
{labelDate: "Jul 2013", matterCount: "2"},
{labelDate: "Aug 2013", matterCount: "2"},
{labelDate: "Sep 2013", matterCount: "10"},
{labelDate: "Oct 2013", matterCount: "1"},
{labelDate: "Nov 2013", matterCount: "1"},
{labelDate: "Dec 2013"},
{labelDate: "Jan 2014"},
{labelDate: "Feb 2014", matterCount: "1"},
{labelDate: "Mar 2014"},
{labelDate: "Apr 2014", matterCount: "17"},
{labelDate: "May 2014", matterCount: "21"}];

desired outcome 
merge  = [{labelDate: "Jun 2013", matterCount: "1"},
{labelDate: "Jul 2013", matterCount: "2"},
{labelDate: "Aug 2013", matterCount: "2"},
{labelDate: "Sep 2013", matterCount: "10"},
{labelDate: "Oct 2013", matterCount: "1"},
{labelDate: "Nov 2013", matterCount: "1"},
{labelDate: "Dec 2013", matterCount: "0"},
{labelDate: "Jan 2014", matterCount: "0"},
{labelDate: "Feb 2014", matterCount: "1"},
{labelDate: "Mar 2014", matterCount: "0"},
{labelDate: "Apr 2014", matterCount: "17"},
{labelDate: "May 2014", matterCount: "21"}];

https://jsfiddle.net/cp39aoyf/2/

1 Ответ

1 голос
/ 09 мая 2019

Как насчет || значения по умолчанию:

const merge = (x, y) =>
        x.map(xItem => ({
          ...y.find(yItem => yItem.labelDate === xItem.labelDate && yItem) || {...xItem, matterCount: "0"}
        }));

Демонстрация JSFiddle.

Другим способом будет просто добавить значение по умолчанию, которое будет переопределено yItem, если оно существует:

const merge = (x, y) =>
    x.map(xItem => ({
      ...xItem,
      ...{matterCount: "0"},
      ...y.find(yItem => yItem.labelDate === xItem.labelDate && yItem)
    }));

Скрипка для этого.

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