Javascript 从JSON生成映射/数组
我有以下对象结构Javascript 从JSON生成映射/数组,javascript,arrays,json,Javascript,Arrays,Json,我有以下对象结构 { carMaker: { Id: '01', Name: 'Audi', Headquarter: 'Germany' }, modelName: 'R8', Id: '1', CarMaker: 'Audi', color: 'black' } 基本上,这是一个汽车清单,其中提到了其汽车制造
{
carMaker: {
Id: '01',
Name: 'Audi',
Headquarter: 'Germany'
},
modelName: 'R8',
Id: '1',
CarMaker: 'Audi',
color: 'black'
}
基本上,这是一个汽车清单,其中提到了其汽车制造商的名字。
汽车制造商的详细信息也嵌套在关键汽车制造商的内部
我想要的是填充一个JSON结构,其中包含汽车制造商的列表,其中汽车制造商创建的汽车位于关键carsList下的数组中
有谁能建议一种有效的方法来实现这一点,而不使用两个for循环,这将是一种简单的解决方法,并且会影响较大值的性能
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title></title>
<script src="../content/vendor_js/AngularJS/angular.js"></script>
<script>
var testmodule = angular.module('testmodule', []);
testmodule.controller('testcontroller', ['$scope', function ($scope) {
$scope.carList = [
{
carMaker: {
Id: '01',
Name: 'Audi',
Headquarter: 'Germany'
},
modelName: 'R8',
Id: '1',
CarMaker: 'Audi',
color: 'black'
}, {
carMaker: {
Id: '01',
Name: 'Audi',
Headquarter: 'Germany'
},
modelName: 'A7',
Id: '2',
CarMaker: 'Audi',
color: 'red'
}, {
carMaker: {
Id: '02',
Name: 'Nissan',
Headquarter: 'Japan'
},
modelName: 'GTR',
Id: '4',
CarMaker: 'Nissan',
color: 'yellow'
}, {
carMaker: {
Id: '03',
Name: 'Volkswagen',
Headquarter: 'Germany'
},
modelName: 'Polo',
Id: '5',
CarMaker: 'Volkswagen',
color: 'black'
}
];
$scope.carMakerList = {};
$scope.createJSONArray = function () {
angular.forEach($scope.carList, function (car) {
$scope.carMakerList[car.carMaker.Name] = car.carMaker;
});
angular.forEach($scope.carMakerList, function (carMaker) {
carMaker.cars = [];
});
angular.forEach($scope.carList, function (car) {
$scope.carMakerList[car.CarMaker]["cars"].push(car);
});
};
$scope.createJSONArray();
}]);
</script>
</head>
<body ng-app="testmodule" ng-controller="testcontroller">
<table border="1">
<tr ng-repeat="carmaker in carMakerList">
<td><p ng-bind="carmaker.Id"></p></td>
<td><p ng-bind="carmaker.Name"></p></td>
<td>
<ul>
<li ng-repeat="cars in carmaker.cars">
<p ng-bind="cars.modelName"></p>
</li>
</ul>
</td>
</tr>
<tr>
<h3></h3>
</tr>
</table>
</body>
</html>
var testmodule=angular.module('testmodule',[]);
testmodule.controller('testcontroller',['$scope',函数($scope){
$scope.carList=[
{
汽车制造商:{
Id:'01',
名称:“奥迪”,
总部:德国
},
型号名称:“R8”,
Id:'1',
汽车制造商:“奥迪”,
颜色:“黑色”
}, {
汽车制造商:{
Id:'01',
名称:“奥迪”,
总部:德国
},
型号名称:“A7”,
Id:'2',
汽车制造商:“奥迪”,
颜色:“红色”
}, {
汽车制造商:{
Id:'02',
名称:'日产',
总部:日本
},
型号名称:“全球技术法规”,
Id:'4',
汽车制造商:“日产”,
颜色:“黄色”
}, {
汽车制造商:{
Id:'03',
名称:“大众”,
总部:德国
},
型号名称:“Polo”,
Id:'5',
汽车制造商:“大众”,
颜色:“黑色”
}
];
$scope.list={};
$scope.createJSONArray=函数(){
角度.forEach($scope.carList,函数(car){
$scope.automobillist[car.automobile.Name]=car.automobile;
});
angular.forEach($scope.automobilist,函数(汽车制造商){
汽车制造商.汽车=[];
});
角度.forEach($scope.carList,函数(car){
$scope.automobillist[car.automobile制造商][“cars”]。推送(car);
});
};
$scope.createJSONArray();
}]);
-
这是一个单循环提案,其中有一个对象作为carsList的参考
var data=[{汽车制造商:{Id:'01',名称:'Audi',总部:'Germany'},车型名称:'R8',Id:'1',汽车制造商:'Audi',颜色:'black'},{汽车制造商:{Id:'01',名称:'Audi',总部:'Germany'},车型名称:'A7',Id:'2',汽车制造商:'Audi',颜色:'red'},{汽车制造商:{Id:'02',名称:'Nissan',总部:'Japan,车型名称:'GTR',Id:'4',汽车制造商:'Nissan',颜色:'yellow'},{汽车制造商:{Id:'03',名称:'Volkswagen',总部:'Germany'},车型名称:'Polo',Id:'5',汽车制造商:'Volkswagen',颜色:'black'},
分组=[];
data.forEach(函数(a){
var key=a.汽车制造商名称,o;
如果(!此[键]){
o={Id:a.automomer.Id,Name:a.automomer.Name,总部:a.automomer.总部,carsList:[]};
此[键]=o.carsList;
分组。推(o);
}
此[key].push({modelName:a.modelName,Id:a.Id,color:a.color});
},Object.create(null));
document.write(“”+JSON.stringify(分组,0,4)+“”)代码>请添加所需的结构和您尝试的代码。您自己还没有尝试解决此问题。请仅使用一个属性创建有效的对象结构<代码>汽车制造商代码>。很抱歉,没有提供确切的结构,我已用正确的代码更新了问题。很抱歉没有制作小提琴,因为我不知道如何将angular.js文件添加到小提琴中。现在我已经在上面的问题中写下了我的全部代码@Nina Scholz会影响较大值的性能事实上,这可能不会,也肯定不值得担心,直到您确定它是。感谢Nina,+1的实现,但是如果我有很多键,而不仅仅是有限的Id、名称,总部。但是现在这种方法很好,从你那里学到了一些东西:)对于许多关键点,你可以使用一个带有关键点的数组,并交互创建所有新属性。