AngularJS: ng-repeat with unique values ​​in a specific method

I have one object like this

$scope.listvalues = [{ name:A, id:101 },

                     { name:B, id:102 },

                     { name:A, id:103 },

                     { name:C, id:101 },

                     { name:A, id:102 },

                     { name:B, id:103 }];

      

I need to print this object in the following structure

name |101 | 102 |103 |
-----|----|-----|---------
 A   |YES | YES |YES |
-----|----|-----|------------
 B   |No  | YES |YES |
-----|----|-----|-----------
 C   |YES |  NO |NO  |

      

Here I need to print the name "A" in unique and also indicate that A is available for Id. Can I do with angular ng-repeat ?. Anyone please suggest ...

+3


source to share


3 answers


You can, but you have to write a filter that changes the structure of your data to the following:

$scope.data = [
    {A: {'101': true, '102': true, '103': true}}, 
    {B: {'101': false, ...}},
    {C: ...}
]

      

And then you can write the table like this:

   <table>
     <tr>
       <th>name</th>
       <th ng-repeat="(column, value) in data[0]">{{column}}</th>
     </tr>
     <tr ng-repeat="row in data">
       <td ng-repeat="(column, value) in data[0]">{{row[column] ? 'Yes' : 'No'}}</td>
     </tr>
   </table>

      




Filter example:

yourModule.filter('makeNgRepeatable', function(){
    return function(oldStructure) {
       // Add code here to convert oldStructure to newStructure.
       return newStructure;
    }
});

      

In your controller, enter makeNgRepeatableFilter

and do

$scope.data = makeNgRepeatableFilter([{ name:A, id:101 }, ...]);

      

+1


source


You can wrap it up into a table and then resolve with multiple ng-repeat

for which the cell is YES or NO.

Take a look at this plnkr, it demonstrates how this can be achieved.

http://plnkr.co/edit/QI8ZrsbwYuJUeV4DNWGl?p=preview

First, you collect all the IDs and names.

$scope.names = $scope.listvalues.map(function(d){return d.name}).unique();
$scope.ids = $scope.listvalues.map(function(d){return d.id}).unique();

      



Note. In plnkr, I have defined functions unique

and contains

. If you use some other libraries like underscore, these functions may already be present.

Then you define a function to determine if a particular cell should be true or false.

  $scope.hasValue = function(name, id)  {
    for(var i = 0; i < $scope.listvalues.length; ++i)
      if($scope.listvalues[i].name === name && $scope.listvalues[i].id === id)
        return true;
    return false;
  }

      

However, it would be easier if you could convert yours listvalues

to a sane structure. This will prevent some costs.

0


source


With your array structure, you may need additional helper array / objects. In your case, it might look like this:

<table class="table table-bordered">
    <thead>
        <tr>
            <th>Name</th>
            <th ng-repeat="th in values">{{th}}</th>
        </tr>
    </thead>
    <tbody>
        <tr ng-repeat="obj in names">
            <td>
                {{obj.name}}
                <div><small>{{obj}}</small></div>
            </td>
            <td>{{obj.ids.indexOf(values[0]) > -1 ? 'YES' : 'NO'}}</td>
            <td>{{obj.ids.indexOf(values[1]) > -1 ? 'YES' : 'NO'}}</td>
            <td>{{obj.ids.indexOf(values[2]) > -1 ? 'YES' : 'NO'}}</td>
        </tr>
    </tbody>
</table>

      

where auxiliary objects are built as follows:

function initData() {

    var map = {values: {}, names: {}},
        values = [],
        names = [];

    $scope.listvalues.forEach(function(obj) {
        if (!map.values[obj.id]) {
            values.push(obj.id);
            map.values[obj.id] = true;
        }

        if (!map.names[obj.name]) {
            names.push(obj);
            obj.ids = [obj.id];
            map.names[obj.name] = obj;
        }
        else {
            map.names[obj.name].ids.push(obj.id);
        }
    });

    $scope.values = values;
    $scope.names = names;
}

initData();

      

Demo: http://plnkr.co/edit/wWJOjtzstUDKjl9V6hCy?p=preview

0


source







All Articles