How to iterate over the keys and values with ng-repeat in AngularJS?

AngularjsAngularjs Ng-Repeat

Angularjs Problem Overview


In my controller, I have data like: $scope.object = data

Now this data is the dictionary with keys and values from json.

I can access the attribute with object.name in the template. Is there any way that I can iterate over the keys as well and display them in table like

<tr><td> {{key}} </td> <td> data.key </td>

The data is like this

{
    "id": 2,
    "project": "wewe2012",
    "date": "2013-02-26",
    "description": "ewew",
    "eet_no": "ewew",
}

Angularjs Solutions


Solution 1 - Angularjs

How about:

<table>
  <tr ng-repeat="(key, value) in data">
    <td> {{key}} </td> <td> {{ value }} </td>
  </tr>
</table>

This method is listed in the docs: https://docs.angularjs.org/api/ng/directive/ngRepeat

Solution 2 - Angularjs

If you would like to edit the property value with two way binding:

<tr ng-repeat="(key, value) in data">
    <td>{{key}}<input type="text" ng-model="data[key]"></td>
</tr>

Solution 3 - Angularjs

I don't think there's a builtin function in angular for doing this, but you can do this by creating a separate scope property containing all the header names, and you can fill this property automatically like this:

var data = {
  foo: 'a',
  bar: 'b'
};

$scope.objectHeaders = [];

for ( property in data ) {
  $scope.objectHeaders.push(property); 
}

// Output: [ 'foo', 'bar' ]

Solution 4 - Angularjs

we can follow below procedure to avoid display of key-values in alphabetical order.

Javascript

$scope.data = {
   "id": 2,
   "project": "wewe2012",
   "date": "2013-02-26",
   "description": "ewew",
   "eet_no": "ewew",
};
var array = [];
for(var key in $scope.data){
	var test = {};
	test[key]=$scope.data[key];
	array.push(test);
}
$scope.data = array;

HTML

<p ng-repeat="obj in data">
   <font ng-repeat="(key, value) in obj">
      {{key}} : {{value}}
   </font>
</p>

Solution 5 - Angularjs

A todo list example which loops over object by ng-repeat:

var app = angular.module('toDolistApp', []);
app.controller('toDoListCntrl', function() {
  var self = this;
  self.toDoListItems = {};// []; //dont use square brackets if keys are string rather than numbers.
  self.doListCounter = 0;

  self.addToDoList = function() {		  		   
    var newToDoItem = {};
    newToDoItem.title     = self.toDoEntry;
    newToDoItem.completed = false;		   

    var keyIs = "key_" + self.doListCounter++;  		   

    self.toDoListItems[keyIs] = newToDoItem;		   
    self.toDoEntry = ""; //after adding the item make the input box blank.
  };
});

app.filter('propsCounter', function() {
  return function(input) {
    return Object.keys(input).length;
  }
});

<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<body ng-app="toDolistApp">    
  <div ng-controller="toDoListCntrl as toDoListCntrlAs">
    Total Items: {{toDoListCntrlAs.toDoListItems | propsCounter}}<br />
    Enter todo Item:  <input type="text" ng-model="toDoListCntrlAs.toDoEntry"/>
    <span>{{toDoListCntrlAs.toDoEntry}}</span>
    <button ng-click="toDoListCntrlAs.addToDoList()">Add Item</button> <br/>
    <div ng-repeat="(key, prop) in toDoListCntrlAs.toDoListItems"> 
      <span>{{$index+1}} : {{key}}   : Title = {{ prop.title}} : Status = {{ prop.completed}} </span>
    </div>     
  </div>    
</body>

Solution 6 - Angularjs

Complete example here:-

<!DOCTYPE html >
<html ng-app="dashboard">
<head>
<title>AngularJS</title>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.4/jquery.min.js"></script>
<link rel="stylesheet" href="./bootstrap.min.css">
<script src="./bootstrap.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.4/angular.min.js"></script>
</head>
<body ng-controller="myController">
	<table border='1'>
		<tr ng-repeat="(key,val) in collValues">
			<td ng-if="!hasChildren(val)">{{key}}</td>	
			<td ng-if="val === 'string'">
				<input type="text" name="{{key}}"></input>
			</td>
			<td ng-if="val === 'number'">
				<input type="number" name="{{key}}"></input>
			</td>
			<td ng-if="hasChildren(val)" td colspan='2'>
				<table border='1' ng-repeat="arrVal in val">
					<tr ng-repeat="(key,val) in arrVal">
						<td>{{key}}</td>	
						<td ng-if="val === 'string'">
							<input type="text" name="{{key}}"></input>
						</td>
						<td ng-if="val === 'number'">
							<input type="number" name="{{key}}"></input>
						</td>
					</tr>
				</table>				
			</td>

		</tr>		
	</table>
</body>

<script type="text/javascript">
	
	var app = angular.module("dashboard",[]);
	app.controller("myController",function($scope){
		$scope.collValues = {
			'name':'string',
			'id':'string',
			'phone':'number',
			'depart':[
					{
						'depart':'string',
						'name':'string'	
					}
			]	
		};

		$scope.hasChildren = function(bigL1) {
  			return angular.isArray(bigL1);
} 
	});
</script>
</html>

Solution 7 - Angularjs

    Use below code it is working to display your key and value here is key start with 1:
         <tr ng-repeat="(key,value) in alert_list" >
                   <td>{{key +1}}</td>
                   <td>{{value.title}}</td>
                 </tr>
Below is document link for it. 

https://docs.angularjs.org/api/ng/directive/ngRepeat

Solution 8 - Angularjs

You can do it in your javascript (controller) or in your html (angular view)...

js:

$scope.arr = [];
for ( p in data ) {
  $scope.arr.push(p); 
}

html:

<tr ng-repeat="(k, v) in data">
    <td>{{k}}<input type="text" ng-model="data[k]"></td>
</tr>

I believe the html way is more angular , but you can also do in your controller and retrieve it in your html...

also not a bad idea to look at the Object keys, they give you the an array of the keys if you need them, more info here:

https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Object/keys

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
Questionuser192362127View Question on Stackoverflow
Solution 1 - AngularjsJosh David MillerView Answer on Stackoverflow
Solution 2 - AngularjscbkView Answer on Stackoverflow
Solution 3 - AngularjsFelipe CastroView Answer on Stackoverflow
Solution 4 - Angularjsuser3414423View Answer on Stackoverflow
Solution 5 - AngularjsAshish SaxenaView Answer on Stackoverflow
Solution 6 - AngularjsAjay KumarView Answer on Stackoverflow
Solution 7 - AngularjsChirag PrajapatiView Answer on Stackoverflow
Solution 8 - AngularjsAlirezaView Answer on Stackoverflow