Как написать функцию, которая будет создавать объект из нескольких объектов с массивом - PullRequest
0 голосов
/ 25 апреля 2020

Добрый день, у меня были трудности. Я столкнулся с проблемой, которую не могу решить. У меня есть массив объектов:

[
    {
        date: "2020-04-20",
        groups: ["apple"],
        type: ["fruit"],
    },
    {
        date: "2020-04-20",
        groups: ["potate"],
        type: ["vegetable"],
    },
    {
        date: "2020-04-23",
        groups: ["burger"],
        type: ["fastfood"],
    },
    {
        date: "2020-04-24",
        groups: ["cola"],
        type: ["water"],
    }
]

Мне нужно написать функцию, которая будет определять скрещивание двух объектов в один по дате. То есть ожидаемый результат, который будет возвращать функция, должен быть следующим:

[
    {
        date: "2020-04-20",
        groups: ["apple", "potate"],
        type: ["fruit", "vegetable"],
    },
    {
        date: "2020-04-23",
        groups: ["burger"],
        type: ["fastfood"],
    },
    {
        date: "2020-04-24",
        groups: ["cola"],
        type: ["water"],
    }
]

Заранее благодарен за помощь!

Ответы [ 3 ]

1 голос
/ 25 апреля 2020

Сначала рассмотрим, что вы пытаетесь выполнить sh. Вы хотите объединить данные вместе. Хорошим инструментом для этого, а также для перехода от одной структуры данных к другой является Array.prototype.reduce.

Концептуально, я бы предложил создать карту между датой и всем объектом. Это поможет вам определить, существует ли уже запись. Затем вы можете набрать sh соответствующие ключи для соответствующих массивов во время итерации. Наконец, вы можете использовать Object.values, чтобы получить только значения карты, которую вы создали.

Это шаблон, который я часто использую для подобных ситуаций.

Я бы сделал что-то вроде следующее:

const input = [
    {
        date: "2020-04-20",
        groups: ["apple"],
        type: ["fruit"],
    },
    {
        date: "2020-04-20",
        groups: ["potate"],
        type: ["vegetable"],
    },
    {
        date: "2020-04-23",
        groups: ["burger"],
        type: ["fastfood"],
    },
    {
        date: "2020-04-24",
        groups: ["cola"],
        type: ["water"],
    }
];

const combine = (arr) => {
  const dateMap = arr.reduce((acc, item) => {
    if (!acc[item.date]) {
      acc[item.date] = item;
    } else {
      acc[item.date].groups = [...acc[item.date].groups, ...item.groups];
      acc[item.date].type = [...acc[item.date].type, ...item.type];
    }
    return acc;
  }, {});
  return Object.values(dateMap);
};

console.log(combine(input));
0 голосов
/ 25 апреля 2020

Вы также можете решить эту проблему с помощью forEach. Попробуйте:

var sortedData=[];
var data = [{ date: "2020-04-20", groups: ["apple"], type: ["fruit"] }, { date: "2020-04-20", groups: ["potate"], type: ["vegetable"] }, { date: "2020-04-23", groups: ["burger"], type: ["fastfood"] }, { date: "2020-04-24", groups: ["cola"], type: ["water"] }];
data.forEach((elem, index, arr)=>{
      isDatePresent= sortedData.some((value)=>value.date==elem.date);
      if(!isDatePresent){
        sortedData.push(elem);
      } else {
        var index=sortedData.findIndex((value)=> value.date==elem.date);
        sortedData[index].groups= [...sortedData[index].groups, ...elem.groups];
        sortedData[index].type= [...sortedData[index].type, ...elem.groups];
      }
});

console.log(sortedData)
0 голосов
/ 25 апреля 2020

Можно взять стандартную группировку с объектом для сбора значений.

var data = [{ date: "2020-04-20", groups: ["apple"], type: ["fruit"] }, { date: "2020-04-20", groups: ["potate"], type: ["vegetable"] }, { date: "2020-04-23", groups: ["burger"], type: ["fastfood"] }, { date: "2020-04-24", groups: ["cola"], type: ["water"] }],
    result = Object.values(data.reduce((r, o) => {
        r[o.date] = r[o.date] || { date: o.date, groups: [], type: [] };
        r[o.date].groups.push(...o.groups);
        r[o.date].type.push(...o.type);
        return r;
    }, {}));

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...