检查包含对象作为数组的数组中的副本

时间:2015-12-18 10:09:45

标签: javascript arrays

我想检查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;

                }
            }
        }
    }

2 个答案:

答案 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您的循环
  • 无需ij变量来跟踪循环计数器
  • 无需复制$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推入其中。