假设我收到一个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;
}
循环并分配每个唯一选项吗?或者还有其他更有效的方法。
说我已经获得了数组tagNames[]
我的下一个工作是执行搜索以检查数组varString
中是否存在给定变量tagNames[]
并返回true或因此错误。
我知道scope.tagNames.indexOf(varString)
会在没有匹配时返回-1
,
但这是有角度的方式吗?这些方法是否被视为良好做法?
答案 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