Angularjs,从json对象输出一个字符串或一个字符串数组

Angularjs, output a string or an array of strings from json object

本文关键字:一个 字符串 数组 json 输出 对象 Angularjs      更新时间:2023-09-26

假设我有一个json对象:

{record: [{value:"some string"}, {value:["A string", "B string"]}]}

我想从中得到的输出非常简单:如果有单个字符串,则为字符串,如果有字符串数组,则为串联字符串

value: some string
value: A string, B string

但是当我写这个代码时:

<span ng-repeat="r in record">value: {{r.value}}<br/></span>

这两个值都被认为是字符串,我得到的输出是:

value: some string
value: ["A string", "B string"]

当我写这个代码时:

<span ng-repeat="r in record">value: {{r.value.join(", ")}}<br/></span>

两个值都被认为是数组,由于第一个值不是,所以我得到了这个(第一个值缺失):

value:
value: A string, B string

处理这个问题的最佳方法是什么?

您可以打开表达式中的类型:

<span ng-repeat="r in record">
    value: {{ Array.isArray(r.value) ? r.value.join(", ") : r.value }}<br/>
</span>

或者你可以添加一个过滤器来封装逻辑:

myModule.filter('joinIfArray', function () {
    return function (input) {
        return Array.isArray(input) ? input.join(", ") : input;
    };
});    

并像一样使用它

<span ng-repeat="r in record">value: {{ r.value | joinIfArray }}<br/></span>

稍短:

<span ng-repeat="r in record">value: {{r.value.join(", ") || r.value}}<br/></span>

另一种方式,它应该是递归的。

您当前的文件:

<span ng-repeat="r in record track by $index" ng-include="'mytemplate.html'"></span>

template.html:

<span ng-if="! isArray(r.value)">value: {{r.value}}<br/></span>
<span ng-if="isArray(r.value)"><span ng-include="'mytemplate.html'"></span><span ng-if="!$last">, </span></span>

在控制器中:

$scope.is_array = function(data) {
  return Array.isArray(data);
}