将数组对象的属性用逗号分隔列出。
将数组对象的属性用逗号分隔列出。
我有一个对象数组,其中包含属性'name'。
我想将所有名称作为字符串列在一个div中,以','分隔。
我用underscore这样做:
{{email.name}}{{$last ? '' : ', '}}
结果:
我是新手, 我也是, 还有我!
如何用angular的方式解决这个问题?
谢谢!
Fiddle: http://jsfiddle.net/UJEnt/
问题的原因是需要实现类似于CSV的行为,即将一个数组中的对象的属性以逗号分隔的形式输出。
解决方法是使用自定义过滤器filter来实现。在给定的示例中,使用了名为csv的自定义过滤器。
过滤器的代码如下:
myApp.filter('csv', function() { return function(values, property_name) { var result = ''; for (var i = 0; i < values.length; i++) { var value = values[i]; if (property_name) { value = value[property_name]; } result += value; if (i + 1 != values.length) { result += ','; } } return result; }; });
使用这个过滤器的方式是在HTML中使用双花括号并指定要过滤的数组和属性名:
{{friends | csv:'name'}}
如果处理的是字符串数组,也可以不指定属性名直接使用过滤器:
{{another_string_array | csv}}
以上代码会将数组中的对象的属性以逗号分隔的形式输出。最终的结果可以在给定的示例链接中查看。
在这段代码中,出现了一个问题:无法正确地将数组中的对象属性连接起来并以逗号分隔。
这个问题的原因是,在JS代码中定义的AngularJS过滤器函数`concat`中,参数`input`和`field`没有正确地传递给函数。在函数体内,使用了`input.length`和`input[i][field]`来获取数组的长度和对象的属性值,但是`input`和`field`并没有正确地传递进来。
解决这个问题的方法是在JS代码中修改过滤器函数的定义,确保正确地传递参数。可以将过滤器函数定义中的参数改为`function(input, field)`,这样在函数体内就可以正确地使用`input`和`field`了。
下面是修改后的代码:
JS:
angular.module('foo').filter('concat', function() { return function(input, field) { var result = []; for (var i = 0, ii = input.length; i < ii; ++i) { result.push(input[i][field]); } return result.join(', '); }; });
HTML:
<span>{{ friends | concat:'name' }}</span>
通过以上的修改,代码中的问题得到了解决。现在,当`concat`过滤器被应用到`friends`数组时,它会正确地将数组中的每个对象的`name`属性连接起来,并以逗号分隔。