将原始javascript对象数组转换为结构化对象树,以备重复
我正在用node.js、mssql(不问..客户端)、socket.io和angularjs构建一个应用程序 我已经成功地将数据从mssql获取到angular,格式如下将原始javascript对象数组转换为结构化对象树,以备重复,javascript,arrays,node.js,angularjs,dynamic-arrays,Javascript,Arrays,Node.js,Angularjs,Dynamic Arrays,我正在用node.js、mssql(不问..客户端)、socket.io和angularjs构建一个应用程序 我已经成功地将数据从mssql获取到angular,格式如下 [ { "measure":"value", "region":"London", "manager":"Jack", "supervisor":"James", "number1":44, "number2":2244.3
[
{
"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循环运行它有任何建议,我将不胜感激,因为我正在努力工作。特别是尝试设置对象关键点
我唯一能想到的另一种方法是在节点中运行一组查询,并将其放在服务器端而不是客户端。然而,考虑到我使用的是mssql,我希望将查询量保持在最低限度
谢谢我不会说这是最好的解决方案,而是实现您目标的解决方案 通过使用
.reduce
和angular.forEach
的特定迭代,我已经将JSON
扁平化为相应的结构。$scope.flattedRecord
包含转换后的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
}
}
}
}
}
}
]
所以你的问题是关于数据转换,对吗?我会使用类似于array.prototype.reduce的东西将我的ArrayIn转换为对象。你可以在这里了解更多关于它的信息。鉴于你没有发布任何代码或任何“最佳”标准(如快速、易于维护、广泛兼容等),很难判断这是否是“最佳方式”。forEach可能是一个合理的选择,但可能是也可能不是“最佳”。谢谢您的评论@DayanMorenoLeon是的,数据转换是问题的基础,我将研究reduce方法。@RobG首先要考虑编程的容易程度,其次是应用程序的速度,因为这是我必须对不同视图进行类似操作的许多数据集之一,我认为专注于一个可能会导致相反的解决方案!如果你完全了解了reduce、map、filter的工作原理,那么使用它们会很好。但是很多人都很难理解,所以选择好变量名的简单循环可能最容易理解和维护。它们可能会比嵌套迭代器快,有时会快得多,因为它们的函数调用要少得多。这并不能完全解决我的问题,因为我想要的是大写的“总计”值是从主管编号中直接加起来的。。不过,非常感谢你花了这么多时间,它给了我一些好主意!!嗨,詹姆斯,你收到我的邮件了吗?我是在6月26日收到你的邮件后投下的