【问题标题】:json data validation with input values using angular Js and javascript使用 Angular Js 和 javascript 对输入值进行 json 数据验证
【发布时间】:2016-04-15 12:23:37
【问题描述】:

我在 Angular JS 项目中这样的文件 (/static/models.json) 中有 json 数据..

{
    "familyType": {
        "A650": [{
            "partID": "2630_H"
        }, {
            "partID": "2690_H"
        }, {
            "partID": "2680_H"
        }, {
            "partID": "2600_H"
        }, {
            "partID": "2620_H"
        }, {
            "partID": "2610_H"
        }],
        "S400": [{
                "partID": "S500_Aru"
            }, {
                "partID": "S600_Aru"
            }, {
                "partID": "S700_Aru"
            }, {
                "partID": "S800_Aru"
            }, {
                "partID": "S900_Aru"
            }, {
                "partID": "S100_Aru"
            }
        ]
    }
}

我有下面的函数,参数传递到该方法(Part_id1,Part_id2)和函数内部..我有两种家庭类型(A650,S400),我需要检查是否两个输入 part_Id(Part_id1, Part_id2) 是否属于同一家族(即 A650S400

如果两个 part_id(Part_id1, Part_id2) 来自不同的家庭类型,我需要提醒用户... 我们如何遍历 json 文件并比较两种家庭类型中的 part_ID ..

$scope.ValidateModelList = function(Part_id1, Part_id2, $http) {
     if ($scope.firTable.selectedRowsCount != 0) {
         $http.get("/static/models.json")
             .success(function(response) {
                 $scope.names = response;
             });
         // here i am storing json data in $scope.names object
         //  here i need to check that the part_ids with the family
     }
 }

哪位大神能帮忙解决一下,不胜感激....

在此先感谢....

更新

function ValidateModel(partIDlist){

             alert('2');
             var data = stubdata; // Stubdata is actual json data mentioned above
             var partIdResult = [];
             for (var key in data.familyType) {

                 angular.forEach(data.familyType[key], function (object) {

                     angular.forEach(partIDlist, function (partId) {

                         if (partId == object.partID) {
                             partIdResult.push({
                                 value: partId, family: key
                             });
                         }
                     });
                 });
             }

             for (var i = 0; i < partIdResult.length; i++) {
                // alert(partIdResult.length);
                //alert(partIdResult.family);
                alert(JSON.stringify(partIdResult))
                alert(partIdResult.family); // this is giving undefined value
             alert(partIdResult[0].family);

                 if (partIdResult.family === partIdResult[0].family){
                     alert('yes');
                     alert("part_id's are same");
                 }
                 else if (partIdResult.family !== partIdResult[0].family) {
                     alert("part_id's not same");
                 }
             }
         }

我在这里传递一个这样的列表..

var partIDlist= ["S900_Aru", "S500_Aru", "2610_H"];

我得到 alert(JSON.stringify(partIdResult)) partIdResult 就像这样

 [{"value":"S900_Aru","family":"S400"},
 {"value":"S500_Aru","family":"S400"},
 {"value":"2610_H","family":"A650"}]

我应该得到这三个 part_id 不属于同一个模型 .. 而不是这个我得到 part_id 属于同一个

你能帮忙吗...在此先感谢....

【问题讨论】:

    标签: javascript jquery angularjs json angularjs-directive


    【解决方案1】:

    First succes 不推荐使用 .then 代替。第二个数据存储在 response.data 下。

    .then(function(response) {
         var data = response.data;
         var partId2Family = null, partId1Family = null;
    
         for(var key in data.familyType){
             angular.forEach(data.familyType[key], function(object){
                  if(Part_id1 == object.partID){
                      partId1Family = key;
                  }
                  if(Part_id2 == object.partID){
                      partId2Family = key;
                  }
             })
         }     
         if(partId1Family !== PartId2Family){
              // warning
         }         
    }
    

    这应该可以解决问题。

    编辑:数组版本

    .then(function(response) {
         var data = response.data;
        var partIdResult = [];
         for(var key in data.familyType){
             angular.forEach(data.familyType[key], function(object){
                  angular.forEach(partIds, function(partId){
                       if(partId == object.partID){
                            partIdResult.push({value:partId, family:key});
                       }
                  });
             })
         }     
         for(var i = 1; i < partIdResult.length; i++){
             if(partIdResult[i].family !== partIdResult[0].family){
                    //error
             }
         }      
    }
    

    【讨论】:

    • 您好,非常感谢.. 再来一个查询.. 如果我们得到带有 part_id 列表的数组列表.....这次我们如何检查是否都属于同一个家庭......
    • 我编辑并添加了数组版本。注意:在网上查看 underscorejs,它是一个非常有用的库,它提供了实用功能,可以在处理循环数组或对象属性时编写更清晰的代码。
    • 没问题,他们只是让你做的事情已经变得更丑陋,更有可能产生错误和浪费时间,我猜这就是他们的问题。假设您可以根据自己的个人兴趣检查它。
    • 它是否也适用于这种情况(即使我在 json 文件中增加了更多的家庭类型......)(S400,A650 ......等等......)
    • 因为 familytype 不是数组,所以我在“var key in data.familyType”这一行出现错误,familtyType is undefined..
    【解决方案2】:
    var partsList = {
        "familyType": {
            "A650": [{
                "partID": "2630_H"
            }, {
                "partID": "2690_H"
            }, {
                "partID": "2680_H"
            }, {
                "partID": "2600_H"
            }, {
                "partID": "2620_H"
            }, {
                "partID": "2610_H"
            }],
            "S400": [{
                    "partID": "S500_Aru"
                }, {
                    "partID": "S600_Aru"
                }, {
                    "partID": "S700_Aru"
                }, {
                    "partID": "S800_Aru"
                }, {
                    "partID": "S900_Aru"
                }, {
                    "partID": "S100_Aru"
                }
            ]
        }
    };
    
    function ValidateModelList(Part_id1, Part_id2){
    
        var part_id_1_family = getPartFamily(Part_id1);
      var part_id_2_family = getPartFamily(Part_id2)
      //alert(part_id_1_family + ", " + part_id_2_family);
        //console.log("part_id_1_family", part_id_1_family);
      //console.log("part_id_2_family", part_id_2_family);
        if(part_id_1_family != part_id_2_family) alert("parts are from different families!");
        else alert("parts from same family.")
    }
    
    function getPartFamily(part_id)
    {
        var familyType = partsList.familyType;
      // loop through family type
        for(var family in familyType)
      {
        if(!familyType.hasOwnProperty(family)) continue;
        //loop through part objects in this family
        for(var j = 0; j < familyType[family].length; j++)
        {
            // check if parts id is in this array
            if(part_id == familyType[family][j].partID) return family;
        }
      }
        return false;
    }
    
    ValidateModelList("2630_H", "S900_Aru");
    
    ValidateModelList("S600_Aru", "S900_Aru");
    

    https://jsfiddle.net/Ladmwdvt/4/

    【讨论】:

    • 您好,非常感谢..如果我们得到带有part_id列表的数组列表......这次我们如何检查所有内容是否属于同一个家庭..
    【解决方案3】:

    虽然不清楚您的问题,但以下是您将如何检查的内容。

    Object.keys(type.familyType).forEach(function(key,index) {
       if(key === Part_id1 || key === Part_id2){
        //do something
         } else {
        //do something else
       }
    });
    

    一个可以玩的小提琴。

    https://jsfiddle.net/2cgww6ec/1/

    【讨论】:

      【解决方案4】:

      试试这个

      var t = {
          "familyType": {
              "A650": [{
                  "partID": "2630_H"
              }, {
                  "partID": "2690_H"
              }, {
                  "partID": "2680_H"
              }, {
                  "partID": "2600_H"
              }, {
                  "partID": "2620_H"
              }, {
                  "partID": "2610_H"
              }],
              "S400": [{
                      "partID": "S500_Aru"
                  }, {
                      "partID": "S600_Aru"
                  }, {
                      "partID": "S700_Aru"
                  }, {
                      "partID": "S800_Aru"
                  }, {
                      "partID": "S900_Aru"
                  }, {
                      "partID": "S100_Aru"
                  }
              ]
          }
      };
      
      search("2630_H","2620_H");
      
      function search(ida,idb) {
        $.each(t['familyType'], function(a, b) {
          var str = JSON.stringify(b);
          if(str.indexOf(ida)>=0 && str.indexOf(idb) >=0){
            alert("same family :  " + a);
            return;
          } 
        });
      }
      <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
      
      <p> search("2630_H","2620_H") will called <p> 

      【讨论】:

        【解决方案5】:

        试试这个:

        var obj = {
            "familyType": {
                "A650": [
                    {
                        "partID": "2630_H"
                    }, {
                        "partID": "2690_H"
                    }, {
                        "partID": "2680_H"
                    }, {
                        "partID": "2600_H"
                    }, {
                        "partID": "2620_H"
                    }, {
                        "partID": "2610_H"
                    }
                ],
                "S400": [
                    {
                        "partID": "S500_Aru"
                    }, {
                        "partID": "S600_Aru"
                    }, {
                        "partID": "S700_Aru"
                    }, {
                        "partID": "S800_Aru"
                    }, {
                        "partID": "S900_Aru"
                    }, {
                        "partID": "S100_Aru"
                    }
                ]
            }
        };
        
        for (familyid in obj.familyType){
            obj.familyTyle[familyid].forEach(function(key){
                if(key.partID == Part_id1) family1 = familyid;
                if(key.partID == Part_id2) family2 = familyid;
            });
        }
        
        if(family1 === family2){
            alert('parts are same');
        }
        

        【讨论】:

        • 嗨,将来会添加更多的家庭类型,所以在这种情况下,我不能像“obj.familyType.A650”那样对每个家庭进行硬编码。 .......有没有通用的方法...
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-06-22
        • 1970-01-01
        • 1970-01-01
        • 2021-04-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多