2016-05-02 2 views
-1

У меня есть следующие структуры объекта,Сделать карту/массив из JSON

{ 
     carMaker: { 
      Id: '01', 
      Name: 'Audi', 
      Headquarter: 'Germany' 
     }, 
     modelName: 'R8', 
     Id: '1', 
     CarMaker: 'Audi', 
     color: 'black' 
    } 

В основном, это список автомобилей, которые ссылаются его Автоконцерн по имени. И детали CarMaker также вложены внутри json с ключом CarMaker.

Я хочу, чтобы заполнить структуру JSON, имеющую список CarMaker, с автомобилями, созданными ими в массиве под клавишей carsList.

Может ли кто-нибудь предложить эффективный способ сделать это, без использования двух циклов, которые были бы легким выходом и повлияли бы на производительность для больших значений.

<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> 
+0

добавьте разыскиваемую структуру и код, который вы пробовали. –

+0

Вы не пытались решить эту проблему самостоятельно. – piRSquared

+0

сделайте действительную структуру объекта только с одним свойством 'CarMaker'. –

ответ

2

Это один цикл предложение с Array#forEach() и объект в качестве ссылки на carsList.

var data = [{ 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' }], 
 
    grouped = []; 
 

 
data.forEach(function (a) { 
 
    var key = a.carMaker.Name, o; 
 
    if (!this[key]) { 
 
     o = { Id: a.carMaker.Id, Name: a.carMaker.Name, Headquarter: a.carMaker.Headquarter, carsList: [] }; 
 
     this[key] = o.carsList; 
 
     grouped.push(o); 
 
    } 
 
    this[key].push({ modelName: a.modelName, Id: a.Id, color: a.color });   
 
}, Object.create(null)); 
 

 
document.write('<pre>' + JSON.stringify(grouped, 0, 4) + '</pre>');

+0

Спасибо за реализацию Nina, +1 за это, но подход к созданию нового объекта совсем немного утомительно, если у меня много ключей, а не только ограниченный идентификатор, имя, штаб-квартира. Но подход на данный момент хорош, выучили несколько вещей от вас :) – Tom

+0

для многих ключей, вы можете использовать массив с ключами и взаимодействовать для создания всех новых свойств. –

Смежные вопросы