#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 июня