Angular - Создать в алфавитном порядке массив объектов - PullRequest
0 голосов
/ 17 марта 2020

У меня есть следующее JSON:

{
    "groups": {
        "1567310400000": [
            {
                "groupName": "Fruits",
                "documentCount": 5
            },
            {
                "groupName": "Vegetables",
                "documentCount": 4
            }
        ],
        "1569902400000": [
            {
                "groupName": "Fruits",
                "documentCount": 1
            },
            {
                "groupName": "Desserts",
                "documentCount": 5
            },
            {
                "groupName": "Vegetables",
                "documentCount": 6
            }
        ]
    }
}

Требуемый вывод: Я хотел бы создать массив объектов из вышеуказанных данных, например:

[{
    name: 'Desserts',
    data: [5]
}, {
    name: 'Fruits',
    data: [5, 1]
}, {
    name: 'Vegetables',
    data: [4,6]
}]

Пока у меня есть следующий код:

chartXAxisData = [];
chartYAxisData = [];

for(let key in data.groups) {
  chartXAxisData.push(formatDate(key, 'MMM dd, yyyy', 'en-US', 'GMT').toString());

  for (let i=0;i<data.groups[key].length; i++) {
    chartYAxisData.push({
                name:data.groups[key][i].groupName, 
                data:data.groups[key][i].documentCount
       });
}}

Это дает следующий вывод вместо желаемого вывода:

[ 
  {
    name: 'Fruits',
    data: 5
  },
  {
    name: 'Vegetables',
    data: 4
  },
  {
    name: 'Fruits',
    data: 1
  },
  {
    name: 'Desserts',
    data: 5
  },
  {
    name: 'Vegetables',
    data: 6
  },
]

Как я могу улучшить это, не сходя с ума с для петель?

1 Ответ

1 голос
/ 17 марта 2020

К сожалению, нет способа проверить значение объектов в массиве без циклов. Даже если вы выполняете функцию, она в конечном итоге выполнит все операции oop. Я прервал добавление данных в chartYAxisData, но это решение добавляет три дополнительных цикла (включая, indexOf и add l oop):

    chartXAxisData = [];
    chartYAxisData = [];

    names = [];
    doccounts = [];

    for(let key in data.groups) {
      chartXAxisData.push(formatDate(key, 'MMM dd, yyyy', 'en-US', 'GMT').toString());

      for (let i=0;i<data.groups[key].length; i++) {
        var groupname = groups[key][i].groupName;
        var doccount = groups[key][i].documentCount;

        if(names.includes(groupname)){
          doccounts[names.indexOf(groupname)].push(doccount);
        }
        else {
          names.push(groupname);
          doccounts.push([doccount]);
        }
    }}

    for(let name in names){
       chartYAxisData.push({
         name:names[name],
         data:doccounts[name]
       });
    }

Я черпал вдохновение из этот пост однако этот пост только спрашивает о том, чтобы увидеть , если объект существует в массиве. Реализация чего-либо с проверкой в ​​конечном итоге все равно добавит больше циклов, поэтому я думаю, что это чище.

Если вы хотите включить 0 в массивы для всех имен, даже если они не включены в метку времени вам нужно больше петель!

chartXAxisData = [];
chartYAxisData = [];

names = [];
doccounts = [];

//Loop through all the groups to get all possible names first
for(let key in data.groups) {
    var groupname = groups[key][i].groupName;

    if(!names.includes(groupname)){
        names.push(groupname);
        doccounts.push([]);
    }
}

//Then perform your main loop
for(let key in data.groups) {
  chartXAxisData.push(formatDate(key, 'MMM dd, yyyy', 'en-US', 'GMT').toString());

  //Create an array that is a copy of all the possible names
  var unusedNames = names;

  for (let i=0;i<data.groups[key].length; i++) {
    var groupname = groups[key][i].groupName;
    var doccount = groups[key][i].documentCount;

    //Remove name from unused name array
    unusedNames.splice(unusedNames.indexOf(groupname), 1);

    doccounts[names.indexOf(groupname)].push(doccount);
  }

  //Loop through all unused names and add 0 to their respective array
  for(let index in unusedNames){
    doccounts[names.indexOf(unusedNames[index])].push(0);
}}

//Then a final loop to add the final objects to an array
for(let index in names){
   chartYAxisData.push({
     name:names[index],
     data:doccounts[name]
   });
}

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