Преобразовать необработанный массив объектов javascript в структурированное дерево объектов, готовое к повторению

#javascript #arrays #node.js #angularjs #dynamic-arrays

#javascript #массивы #node.js #angularjs #динамические массивы

Вопрос:

Я создаю приложение с node.js , mssql (не спрашивайте .. клиент), сокет.ввод-вывод и angularjs.

Мне удалось получить данные из mssql в angular в следующей форме.

 [
    {
        "measure":"value",
        "region":"London",
        "manager":"Jack",
        "supervisor":"James",
        "number1":44,
        "number2":2244.3,
        "number3":1561.6
    },
    {
        "measure":"value",
        "region":"London",
        "manager":"Jack",
        "supervisor":"Jerry",
        "number1":335.4,
        "number2":33.3,
        "number3":11.6
    },
    {
        "measure":"value",
        "region":"London",
        "manager":"John",
        "supervisor":"Joseph",
        "number1":444.3,
        "number2":233,
        "number3":1561.6
    }
]
  

Я пытаюсь манипулировать данными с помощью angular.forEach для достижения следующего результата:

 [
    {
        "region": "London",
        "regionTotals" : {
            "turnover" : {
                "number1" : "TOTAL OF NUMBER 1 WITH REGION LONDON",
                "number2" : "TOTAL OF NUMBER 2 WITH REGION LONDON",
                "number3" : "TOTAL OF NUMBER 3 WITH REGION LONDON"
            }
        },
        "managers" : {
            "jack" : {
                "managerTotals" {
                    "number1": "TOTAL OF NUMBER 1 WITH MANAGER JACK",
                    "number2": "TOTAL OF NUMBER 2 WITH MANAGER JACK",
                    "number3": "TOTAL OF NUMBER 3 WITH MANAGER JACK"
                },
                "supervisors" : {
                    "Jerry": {
                        "supervisorTotals" : {
                            "number1":335.4,
                            "number2":33.3,
                            "number3":11.6
                        }
                    },
                    "James": {
                        "supervisorTotals" : {
                            "number1":44,
                            "number2":2244.3,
                            "number3":1561.6
                        }
                    }
                }
            },
            "john" : {
                "managerTotals" {
                    "number1": "TOTAL OF NUMBER 1 WITH MANAGER JOHN",
                    "number2": "TOTAL OF NUMBER 2 WITH MANAGER JOHN",
                    "number3": "TOTAL OF NUMBER 3 WITH MANAGER JOHN"
                },
                "supervisors" : {
                    "Joseph": {
                        "supervisorTotals" : {
                            "number1":444.3,
                            "number2":233,
                            "number3":1561.6
                        }
                    }
                }
            }
        }
    }
]
  

Это лучший способ сделать это? И если у вас есть какие-либо советы о том, как запустить его через цикл javascript, это было бы очень ценно, поскольку я изо всех сил стараюсь. Особенно пытаюсь установить ключи объекта.

Единственный другой способ, которым я могу это сделать, — запустить кучу запросов в node и объединить их на стороне сервера, а не на стороне клиента. Однако, учитывая, что я использую mssql, я хотел свести запросы к минимуму.

Спасибо

Комментарии:

1. итак, ваш вопрос о преобразовании данных, это правильно? я бы использовал что-то вроде array.prototype.reduce для преобразования моего массива в объект, подробнее об этом можно узнать здесь developer.mozilla.org/en-US/docs/Web/JavaScript/Reference /…

2. Невозможно определить, является ли это «лучшим способом», учитывая, что вы не опубликовали никакого кода или каких-либо критериев для «лучшего» (например, быстрый, простой в обслуживании, широко совместимый и т.д.). forEach , вероятно, является разумным выбором, но может быть или не быть «лучшим».

3. Спасибо за ваши комментарии. @DayanMorenoLeon да, преобразование данных является основой вопроса, я рассмотрю метод сокращения.

4. @RobG Простота программирования в первую очередь и скорость приложения во вторую очередь будут основными критериями, поскольку это один из многих наборов данных, которые я должен выполнять аналогичные манипуляции для разных представлений, я предполагаю, что сосредоточение внимания на одном, вероятно, приведет к противоположным решениям!

5. Если вы полностью понимаете, как работают reduce , map , filter , то их использование может быть отличным. Но многие испытывают трудности, поэтому простые циклы с хорошо подобранными именами переменных могут быть лучшими для легкого понимания и обслуживания. И они, вероятно, будут быстрее, чем вложенные итераторы, иногда намного быстрее, поскольку у них гораздо меньше вызовов функций.

Ответ №1:

Я не буду говорить, что это лучшее решение, а скорее решение, которое достигает вашей цели

Я сгладил JSON в соответствующую структуру, используя определенную итерацию с .reduce и angular.forEach . $scope.flattenedRecord Содержит преобразованный JSON

Рабочая демонстрация

 var app = angular.module('myApp', []);
app.controller('ArrayController', function ($scope) {
    $scope.records = [{
        "measure": "value",
            "region": "London",
            "manager": "Jack",
            "supervisor": "James",
            "number1": 44,
            "number2": 2244.3,
            "number3": 1561.6
    }, {
        "measure": "value",
            "region": "London",
            "manager": "Jack",
            "supervisor": "Jerry",
            "number1": 335.4,
            "number2": 33.3,
            "number3": 11.6
    }, {
        "measure": "value",
            "region": "London",
            "manager": "John",
            "supervisor": "Joseph",
            "number1": 444.3,
            "number2": 233,
            "number3": 1561.6
    }];

    $scope.flattenedRecord = [];

    $scope.managers = [];
    $scope.region = [];

    $scope.records.reduce(function (result, item) {
        $scope.managers.push(item.manager);
        $scope.region.push(item.region);
    }, 0);

    $scope.managers = _.uniq($scope.managers);
    $scope.region = _.uniq($scope.region);

    var mainRecordobj = {};

    angular.forEach($scope.region, function (regionValue) {
        mainRecordobj.region = regionValue;
        var regionTurnoverObj = {};
        var regionNumberObj = {};
        var regionTotalsObj = {};

        var supervisorTotalsObj = {};
        var supervisorNumberObj = {};
        var supervisorNameObj = {};

        var managerTotalsObj = {};
        var managerNameObj = {};
        var managerNumberObj = {};

        regionNumberObj.number1 = "TOTAL OF NUMBER 1 WITH REGION "   regionValue.toUpperCase();
        regionNumberObj.number2 = "TOTAL OF NUMBER 2 WITH REGION "   regionValue.toUpperCase();
        regionNumberObj.number3 = "TOTAL OF NUMBER 3 WITH REGION "   regionValue.toUpperCase();

        angular.forEach($scope.managers, function (managerName) {


            managerNumberObj = {};
            managerNumberObj.number1 = "TOTAL OF NUMBER 1 WITH MANAGER "   managerName.toUpperCase();
            managerNumberObj.number2 = "TOTAL OF NUMBER 2 WITH MANAGER "   managerName.toUpperCase();
            managerNumberObj.number3 = "TOTAL OF NUMBER 3 WITH MANAGER "   managerName.toUpperCase();
            managerTotalsObj = {};

            managerTotalsObj.managerTotals = managerNumberObj;
            supervisorNameObj = {};

            angular.forEach($scope.records, function (recordArray, recordIndex) {

                if (managerName === recordArray.manager) {
                    angular.forEach(recordArray, function (recordValue, recordKey) {

                        if (recordValue === managerName) {
                            supervisorNumberObj = {};
                            supervisorNumberObj.number1 = recordArray.number1;
                            supervisorNumberObj.number2 = recordArray.number2;
                            supervisorNumberObj.number3 = recordArray.number3;
                            supervisorTotalsObj = {};
                            supervisorTotalsObj.supervisorTotals = supervisorNumberObj;
                            supervisorNameObj[recordArray.supervisor] = supervisorTotalsObj;
                        }

                    });
                }
            });

            managerTotalsObj.supervisors = supervisorNameObj;
            managerNameObj[managerName.toLowerCase()] = managerTotalsObj;
        });
        regionTurnoverObj.turnover = regionNumberObj;
        mainRecordobj.regionTotals = regionTurnoverObj;
        mainRecordobj.managers = managerNameObj;
        $scope.flattenedRecord.push(mainRecordobj);
        console.log(angular.toJson($scope.flattenedRecord));
    });
});
  

ВЫВОД

 [
  {
    "region": "London",
    "regionTotals": {
      "turnover": {
        "number1": "TOTAL OF NUMBER 1 WITH REGION LONDON",
        "number2": "TOTAL OF NUMBER 2 WITH REGION LONDON",
        "number3": "TOTAL OF NUMBER 3 WITH REGION LONDON"
      }
    },
    "managers": {
      "jack": {
        "managerTotals": {
          "number1": "TOTAL OF NUMBER 1 WITH MANAGER JACK",
          "number2": "TOTAL OF NUMBER 2 WITH MANAGER JACK",
          "number3": "TOTAL OF NUMBER 3 WITH MANAGER JACK"
        },
        "supervisors": {
          "James": {
            "supervisorTotals": {
              "number1": 44,
              "number2": 2244.3,
              "number3": 1561.6
            }
          },
          "Jerry": {
            "supervisorTotals": {
              "number1": 335.4,
              "number2": 33.3,
              "number3": 11.6
            }
          }
        }
      },
      "john": {
        "managerTotals": {
          "number1": "TOTAL OF NUMBER 1 WITH MANAGER JOHN",
          "number2": "TOTAL OF NUMBER 2 WITH MANAGER JOHN",
          "number3": "TOTAL OF NUMBER 3 WITH MANAGER JOHN"
        },
        "supervisors": {
          "Joseph": {
            "supervisorTotals": {
              "number1": 444.3,
              "number2": 233,
              "number3": 1561.6
            }
          }
        }
      }
    }
  }
]
  

Комментарии:

1. Это не полностью решает мою проблему, поскольку я хотел, чтобы «ИТОГОВЫЕ» значения в шапках буквально складывались из чисел супервизора.. Однако большое спасибо за то, что потратили время, и это дало мне несколько хороших идей!!

2. Привет, Джеймс, ты получил мое письмо, которое я отправил в ответ на твое письмо 26 июня