_.findWhere()未给出属性值undefined

时间:2017-02-09 11:16:49

标签: angularjs underscore.js

我需要将新对象添加到不允许重复的现有对象数组中,并且对象的唯一性基于对象的所有属性。该对象包含属性: departmentId 2. equipmentId sectionId 4. serviceId

根据我的要求,equipmentId是一个可选字段,即当它没有值时可能是未定义的。我在下面写道:

$scope.isDuplicateRecord = function(){
    var dupCheck =  _.findWhere($scope.equipmentServiceMaps,{departmentId:$scope.equipmentServiceMap.department.departmentId,
                                            equipmentId:$scope.equipmentServiceMap.equipment.equipmentId,
                                            sectionId:$scope.equipmentServiceMap.section.sectionId,
                                            serviceId:$scope.equipmentServiceMap.service.serviceId})

    if(dupCheck== undefined){
        return false
    }else{
        return true
    }
}

此代码与quintmentId的所有值一起正常工作,但未定义除外,即如果存在具有相同departmentId,sectionId,serviceId和equipmentId的现有对象为undefined。它没有找到该对象并返回undefined因此我的检查失败了。

当我将代码更改为基本for循环时,它工作正常,但我想继续使用下划线。以下是for循环的解决方法代码,

var dupCheck = undefined;
    for(var i = 0; i < $scope.equipmentServiceMaps.length; i++){
        if($scope.equipmentServiceMaps[i].departmentId == $scope.equipmentServiceMap.department.departmentId 
        && $scope.equipmentServiceMaps[i].sectionId == $scope.equipmentServiceMap.section.sectionId
        && $scope.equipmentServiceMaps[i].serviceId == $scope.equipmentServiceMap.service.serviceId
        && $scope.equipmentServiceMaps[i].equipmentId == ($scope.equipmentServiceMap.equipment? $scope.equipmentServiceMap.equipment.equipmentId : undefined)){
            dupCheck = $scope.equipmentServiceMaps[i];
            console.log(dupCheck);
            break;
        }
    }
    if(dupCheck == undefined){
        return false
    }else{
        return true
    }

请建议我如何继续使用underscore.js

1 个答案:

答案 0 :(得分:0)

如果您正在寻找一些语法糖,这可能会有所帮助:

var search = {
    departmentId:$scope.equipmentServiceMap.department.departmentId, 
    equipmentId:$scope.equipmentServiceMap.equipment.equipmentId, 
    sectionId:$scope.equipmentServiceMap.section.sectionId, 
    serviceId:$scope.equipmentServiceMap.service.serviceId
}

_.find($scope.equipmentServiceMaps, function(obj) {
    return _.isMatch(_.defaults({}, obj, attrs), attrs);
})

普通的_.findWhere函数或多或少地起作用:

_.find($scope.equipmentServiceMaps, function(obj) {
    return _.isMatch(obj, attrs);
})

在我的版本中,对象中的任何未定义值都将被搜索attrs中的值替换。原始对象未经修改。