我想检查outputTypeId
数组对象中是否存在重复的output
..
以下是JSON:
$scope.entities= [
{
"input": {
"id": 134
},
"output": [
{
"id": 135,
"outputTypeId": 4
}
]
},
{
"input": {
"id": 134
},
"output": [
{
"id": 135,
"outputTypeId": 7
}
]
},
{
"input": {
"id": 134
},
"output": [
{
"id": 135,
"outputTypeId": 9
}
]
}
]
下面是我尝试的代码,但执行后它不会进入条件..
让outputTypeId
为[7]因为我正在检查多个outputTypeId,因此是一个数组
$scope.checkForDuplicateOutputs = (outputTypeId) => {
for (var i = 0; i < $scope.entities.length; i++) {
for (var j = i; j < $scope.entities[i].output[j].length; j++) {
if (outputTypeId.contains($scope.entities[i].output[j].outputTypeId)) {
$scope.isDuplicateOutput = true;
break;
} else {
$scope.isDuplicateOutput = false;
}
}
}
}
答案 0 :(得分:1)
function checkForDuplicates(outputTypeIds) {
$scope.isDuplicateOutput = $scope.entities.some(function(entity) { // Loop through entities
return entity.output.some(function(entityOutput) { // Look for any output
return outputTypeIds.indexOf(entityOutput.outputTypeId) != -1; // which is duplicated in 'outputTypeIds'
});
});
}
所以这个解决方案使用Array.some
- 它有一些优点:
break
您的循环i
和j
变量来跟踪循环计数器$scope.isDuplicateOutput = <boolean>;
答案 1 :(得分:0)
您只使用break
语句打破内部循环,问题是即使重复标志设置为true,它也会在下一次迭代中重置为false。基本上,最后你只能得到最后一次迭代的结果。
最快的解决方法是使用一个标志来表示是否需要停止外部循环:
$scope.checkForDuplicateOutputs = (outputTypeId) => {
var breakOut = false; // <--- this is new
for (var i = 0; i < $scope.entities.length; i++) {
if (breakOut) break; // <--- this is new
for (var j = i; j < $scope.entities[i].output[j].length; j++)
if (outputTypeId.contains($scope.entities[i].output[j].outputTypeId)) {
$scope.isDuplicateOutput = true;
breakOut = true; // <--- this is new
break;
} else {
$scope.isDuplicateOutput = false;
}
}
}
}
如果您仍想迭代所有实体并拥有所有重复项的列表,则可以将$scope.isDuplicateOutput
设为一个数组,然后将重复的ID推入其中。