Javascript объекты в сочетании с Jquery? - PullRequest
0 голосов
/ 13 июня 2018

У меня проблема с манипулированием данными в Javascript / jQuery, и я мог бы использовать некоторую помощь.

У меня есть массив объектов, который выглядит так:

var projects = [
  {title:'project1'},
  {title:'project2'},
  {title:'project3'},
];

У меня есть еще один массив объектов, который выглядит следующим образом:

ganttEvents = [
  {
    text: 'some text',
    start_date: '2018/06/13',
    end_date: '2018/06/14',
    id: '1',
    readonly: true,
    project: 'project1',
    category: 'scoping',
  }
  {
    text: 'some text2',
    start_date: '2018/06/14',
    end_date: '2018/06/15',
    id: '1',
    readonly: true,
    project: 'project2',
    category: 'scoping',
  }
  {
    text: 'some text3',
    start_date: '2018/06/15',
    end_date: '2018/06/16',
    id: '1',
    readonly: true,
    project: 'project2',
    category: 'design',
  }
  {
    text: 'some text4',
    start_date: '2018/06/13',
    end_date: '2018/06/14',
    id: '1',
    readonly: true,
    project: 'project2',
    category: 'scoping',
  }
  {
    text: 'some text5',
    start_date: '2018/06/14',
    end_date: '2018/06/15',
    id: '1',
    readonly: true,
    project: 'project3',
    category: 'testing',
  }
  {
    text: 'some text6',
    start_date: '2018/06/15',
    end_date: '2018/06/16',
    id: '1',
    readonly: true,
    project: 'project3',
    category: 'build',
  }
 ];

Поле проекта ввторой объект всегда будет одним из объектов в первом массиве.

Затем мне нужно получить объект, который выглядит следующим образом:

source: [
    {
    name: "project1", // a project defined in the projects array
    desc: "scoping", // the category from the ganttEvents array of objects
    values: [
              {
                to: "2018/06/13", // the start_date from the ganttEvents array of objects
                from: "2018/06/14", // the end_date from the ganttEvents array of objects
                desc: "some text", // the text from the ganttEvents array of objects
                label: "some text", // the text from the ganttEvents array of objects           
              }
            ]
    },
    {
    name: "project2", // a project defined in the projects array
    desc: "scoping", // the category from the ganttEvents array of objects
    values: [
              {
                to: "2018/06/14",
                from: "2018/06/15",
                desc: "some text2",
                label: "some text2",            
              },
              {
              to: "2018/06/13",
              from: "2018/06/14",
              desc: "some text4",
              label: "some text4",          
              },
            ]
    },
    {
    name: "project3", // a project defined in the projects array
    desc: "testing", // the category from the ganttEvents array of objects
    values: [
              {
              to: "2018/06/14",
              from: "2018/06/15",
              desc: "some text5",
              label: "some text5",          
              }
            ]
    },
    {
    name: "project3", // a project defined in the projects array
    desc: "build", // the category from the ganttEvents array of objects
    values: [
              {
              to: "2018/06/15",
              from: "2018/06/16",
              desc: "some text6",
              label: "some text6",          
              }
            ]
    },
  ]

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

Не могли бы вы помочь?

Редактировать:

Основой этого является то, что я извлекаю список событий из списка SharePoint с помощью SharePointPlus,Это приводит к массиву ganttEvents.Мне нужно подключить это к библиотеке jQuery.Gantt, которая требует, чтобы события были отформатированы определенным образом.

jQuery.Gantt

Извините, но я относительно новичок в Javascript (обычно программист на Python). Я пробовал разные способы сделать это безрезультатно.

1 Ответ

0 голосов
/ 13 июня 2018

Вы можете использовать reduce для группировки массива в объект.Используйте объединенные значения проекта и категории в качестве ключа.Используйте Object.values для преобразования объекта в массив.

var ganttEvents = [{"text":"some text","start_date":"2018/06/13","end_date":"2018/06/14","id":"1","readonly":true,"project":"project1","category":"scoping"},{"text":"some text2","start_date":"2018/06/14","end_date":"2018/06/15","id":"1","readonly":true,"project":"project2","category":"scoping"},{"text":"some text3","start_date":"2018/06/15","end_date":"2018/06/16","id":"1","readonly":true,"project":"project2","category":"design"},{"text":"some text4","start_date":"2018/06/13","end_date":"2018/06/14","id":"1","readonly":true,"project":"project2","category":"scoping"},{"text":"some text5","start_date":"2018/06/14","end_date":"2018/06/15","id":"1","readonly":true,"project":"project3","category":"testing"},{"text":"some text6","start_date":"2018/06/15","end_date":"2018/06/16","id":"1","readonly":true,"project":"project3","category":"build"}];

var result = Object.values(ganttEvents.reduce((c, v) => {
  let k = v.project + "-" + v.category;
  c[k] = c[k] || {name: v.project,desc: v.category,values: []};
  c[k].values.push({to: v.end_date,from: v.start_date,desc: v.text,label: v.text});
  return c;
}, {}));

console.log(result);

Без Object.values() вы можете выполнить цикл, используя for

var ganttEvents = [{"text":"some text","start_date":"2018/06/13","end_date":"2018/06/14","id":"1","readonly":true,"project":"project1","category":"scoping"},{"text":"some text2","start_date":"2018/06/14","end_date":"2018/06/15","id":"1","readonly":true,"project":"project2","category":"scoping"},{"text":"some text3","start_date":"2018/06/15","end_date":"2018/06/16","id":"1","readonly":true,"project":"project2","category":"design"},{"text":"some text4","start_date":"2018/06/13","end_date":"2018/06/14","id":"1","readonly":true,"project":"project2","category":"scoping"},{"text":"some text5","start_date":"2018/06/14","end_date":"2018/06/15","id":"1","readonly":true,"project":"project3","category":"testing"},{"text":"some text6","start_date":"2018/06/15","end_date":"2018/06/16","id":"1","readonly":true,"project":"project3","category":"build"}];

var temp = ganttEvents.reduce((c, v) => {
  let k = v.project + "-" + v.category;
  c[k] = c[k] || {name: v.project,desc: v.category,values: []};
  c[k].values.push({to: v.end_date,from: v.start_date,desc: v.text,label: v.text});
  return c;
}, {});

var result = [];
for (var key in temp) result.push(temp[key]);

console.log(result);
...