获取JSON子对象数组以及在数组中查找匹配项的角度方式。

时间:2014-10-07 11:09:14

标签: javascript json angularjs

问题1

假设我收到一个JSON对象scope.tagSet,其格式如下。

{ Tags : [
           {"TagID" : "ID1" , "TagName" : "Name1"},
           {"TagID" : "ID2" , "TagName" : "Name2"},
           {"TagID" : "ID3" , "TagName" : "Name3"}
         ]
}

在angular指令中,我正在制作TagName中所有值的数组,如下所示。

for(var i= 0; i < scope.tagSet.Tags.length; i++){
                          scope.tagNames[i] = scope.tagSet.Tags[i].TagName;
}

循环并分配每个唯一选项吗?或者还有其他更有效的方法。

问题2

说我已经获得了数组tagNames[]我的下一个工作是执行搜索以检查数组varString中是否存在给定变量tagNames[]并返回true或因此错误。 我知道scope.tagNames.indexOf(varString)会在没有匹配时返回-1

但这是有角度的方式吗?这些方法是否被视为良好做法?

4 个答案:

答案 0 :(得分:1)

你可以做的是制作一个查找清单。在javascript中,您可以使用该对象:

function arrayToLookup(a, key) {
    var o = {};
    for (var i = a.length; i--;) {
        o[a[i][key]] = true;
    }
    return o;
}

像这样使用

var lookupList = arrayToLookup(scope.tagSet.Tags, "TagName");

现在你可以通过这样做来检查它是否可用:

lookupList["Name1"];//returns true

答案 1 :(得分:1)

为什么你如此热衷于以角度方式去做?如果你有一天决定倾斜角度怎么办?这比保持角度但倾销JS更有可能。这是JS方式:

scope.tagNames = scope.tagSet.Tags.map( function (i) {return i.TagName;} )

然后按照你在开始时的建议使用indexOf。

答案 2 :(得分:0)

使用此

var arrayNew=[];
    angular.forEach(scope.tagSet.Tags, function(value, key) {
       arrayNew[i] = value.TagName;
    });
scope.tagNames=arrayNew;

答案 3 :(得分:0)

您可以使用angular-filter module检查您的数组是否包含给定项目:

$scope.items = [
    {"TagID" : "ID1" , "TagName" : "Name1"},
    {"TagID" : "ID2" , "TagName" : "Name2"},
    {"TagID" : "ID3" , "TagName" : "Name3"}
]

// returns true
$scope.Name1 = $filter('contains')($scope.items,'TagName == "Name1"');
// returns false
$scope.Name4 = $filter('contains')($scope.items,'TagName == "Name4"');

这是一个有效的plunker