When using the Angular keyvalue pipe to iterate over an object\'s properties as follows:
You can keep the original order by simply setting the keyvalue pipe to an empty object {}
*ngFor="let property of collection | keyvalue: {}"
To keep the object order you can use
keepOrder = (a, b) => {
return a;
}
Let's say you have
wbs = {
"z": 123,
"y": 456,
"x": 789,
"w": 0#*
}
If you use keyvalue you get alphabetical order by key
w 0#*
x 789
y 456
z 123
applying :keepOrder you keep object order
<ion-item *ngFor="let w of wbs | keyvalue: keepOrder">
<ion-label>{{ w.key }}</ion-label>
<ion-label>{{ w.value }}</ion-label>
</ion-item>
Yes, Object properties iterates randomly since it doesn't get stored as array in memory. However you can sort by properties.
If you want to iterate by insertion position, you need to create one extra property like index and set the timestamp and sort by index.
Below is the pipe you can use to control the sorting and iteration
Pipe
import {Pipe, PipeTransform} from 'angular2/core';
@Pipe({name: 'values'})
export class ValuesPipe implements PipeTransform {
transform(value: any, args?: any[]): Object[] {
let keyArr: any[] = Object.keys(value),
dataArr = [],
keyName = args[0];
keyArr.forEach((key: any) => {
value[key][keyName] = key;
dataArr.push(value[key])
});
if(args[1]) {
dataArr.sort((a: Object, b: Object): number => {
return a[keyName] > b[keyName] ? 1 : -1;
});
}
return dataArr;
}
}
Usage
<div *ngFor='#item in object | values:"keyName":true'>...</div>
<div *ngFor="let item of object | keyvalue: 0">
{{item.key}} : {{item.value}}
</div>
directly write and you will get the data in sameorder as it is in the json
keyvalue: 0
Yes, by default the keyvalue pair sorting data in ascending order.
To keep it unsorted modify as:
keyvalue: 0
Final code:
<div *ngFor="let item of object | keyvalue:0">
{{item.key}}:{{item.value}}
</div>
But for angular 7 or above, you need to put an empty function to keep data unsorted.
<div *ngFor="let item of object | keyvalue: unsorted">
{{item.key}}:{{item.value}}
</div>
In your .ts file just put this empty function.
unsorted() { }
Hope it's helpful.