diff --git a/lib/formatter/arrayify.dart b/lib/formatter/arrayify.dart
new file mode 100644
index 000000000..e38bc1a34
--- /dev/null
+++ b/lib/formatter/arrayify.dart
@@ -0,0 +1,27 @@
+part of angular.formatter_internal;
+
+/**
+ * Given a Map, returns a list of items which have `key` and `value` property.
+ *
+ * Usage:
+ *
+ *
+ * {{item.key}}: {{item.value}}
+ *
+ */
+@Formatter(name:'arrayify')
+class Arrayify implements Function {
+ List<_KeyValue> call(Map inputMap) {
+ if (inputMap == null) return null;
+ List<_KeyValue> result = [];
+ inputMap.forEach((k, v) => result.add(new _KeyValue(k, v)));
+ return result;
+ }
+}
+
+class _KeyValue {
+ K key;
+ V value;
+
+ _KeyValue(this.key, this.value);
+}
diff --git a/lib/formatter/module.dart b/lib/formatter/module.dart
index c2dc22e15..ea84d0231 100644
--- a/lib/formatter/module.dart
+++ b/lib/formatter/module.dart
@@ -29,6 +29,7 @@ export "package:angular/formatter/module_internal.dart" show
Json,
LimitTo,
Lowercase,
+ Arrayify,
Number,
OrderBy,
Uppercase,
diff --git a/lib/formatter/module_internal.dart b/lib/formatter/module_internal.dart
index 576b9959c..f11bc9587 100644
--- a/lib/formatter/module_internal.dart
+++ b/lib/formatter/module_internal.dart
@@ -13,6 +13,7 @@ part 'filter.dart';
part 'json.dart';
part 'limit_to.dart';
part 'lowercase.dart';
+part 'arrayify.dart';
part 'number.dart';
part 'order_by.dart';
part 'uppercase.dart';
@@ -20,6 +21,7 @@ part 'stringify.dart';
class FormatterModule extends Module {
FormatterModule() {
+ type(Arrayify);
type(Currency);
type(Date);
type(Filter);
diff --git a/test/angular_spec.dart b/test/angular_spec.dart
index 13d89c631..26c023deb 100644
--- a/test/angular_spec.dart
+++ b/test/angular_spec.dart
@@ -215,6 +215,7 @@ main() {
"angular.formatter_internal.Json",
"angular.formatter_internal.LimitTo",
"angular.formatter_internal.Lowercase",
+ "angular.formatter_internal.Arrayify",
"angular.formatter_internal.Number",
"angular.formatter_internal.OrderBy",
"angular.formatter_internal.Stringify",
diff --git a/test/formatter/arrayify_spec.dart b/test/formatter/arrayify_spec.dart
new file mode 100644
index 000000000..049cd486c
--- /dev/null
+++ b/test/formatter/arrayify_spec.dart
@@ -0,0 +1,18 @@
+library map_spec;
+
+import '../_specs.dart';
+import 'package:angular/formatter/module.dart';
+
+void main() {
+ describe('arrayify', () {
+ it('should convert a map to list of key value pairs', (Parser parse, FormatterMap formatters) {
+ List result = parse('{"key1": "value1", "key2": "value2"} | arrayify').eval(null, formatters);
+ expect(result.map((kv) => kv.key)).toEqual(["key1", "key2"]);
+ expect(result.map((kv) => kv.value)).toEqual(["value1", "value2"]);
+ });
+
+ it('should treat null as noop', (Parser parse, FormatterMap formatters) {
+ expect(parse('null | arrayify').eval(null, formatters)).toEqual(null);
+ });
+ });
+}