比较angularjs中的对象数组

时间:2017-08-25 03:24:52

标签: javascript angularjs json

我有一个跟随json(示例数据),我从另一个URL

var data = [
{ id: 1, name: 'ravi', parentid: 0 },
{ id: 2, name: 'raj', parentid: 1 },
{ id: 3, name: 'ram', parentid: 1 },
{ id: 4, name: 'raja', parentid: 0 },
{ id: 5, name: 'raju', parentid: 4 },       
{ id: 6, name: 'dinesh', parentid: 4 }  
];

当我以角度获得成功消息时,我想比较具有id的数据 parentid为零,剩余数据为parentid。我尝试了以下代码,但我无法继续执行此操作

$http.get('URL')
    .success(function(data) {
        var categories = data;
        for(var i =0;i<=categories.length;i++)
        {
            if(typeof categories[i] != "undefined" && categories[i].parentId == 0)
            {
                $scope.cat.push(categories[i]);
            }   
            if($scope.cat[i].parentid == categories[i].id)
            {
                $scope.content.push(categories[i]);
            }           
        }

    });

在这里,我想将categories[i].parentId$scope.cat.id进行比较并插入到数组中,但在比较时,我收到$scope.cat[i]之类的错误undefined 最后我的输出如下所示

Ravi
  raj
  ram
raja
  raju
  dinesh

3 个答案:

答案 0 :(得分:1)

我面临下列3个问题:

  1. if(typeof categories[i] != "undefined" && categories[i].parentId == 0)中,您正在比较parentId,它的属性名称永远不会是parentid(检查大小写)。因此,您的第一个if循环永远不会被执行,这就是您$scope.cat未定义的原因。
  2. 解决方案:更正parentId

    的拼写错误
    1. 在,if($scope.cat[i].parentid == categories[i].id)中,您将父元素的父ID与子元素的ID进行比较。
    2. 解决方案:if($scope.cat[i].id == categories[i].parentid)

      1. 您对两个具有不同长度的列表项使用相同的迭代器。
      2. 解决方案:

         var categories = data;
        
         // fill $scope.cat with elements having parent id = 0, so this list will contain all the parent elements
         $scope.cat = categories.filter(function(category) {
             return category && category.parentid === 0
         });
         $scope.content = [];
         // fill $scope.content with elements whose parent exist in $scope.cat (the parent list craeted above)
         categories.forEach(function(category) {
             if ($scope.cat.filter(function(cat) {
                     return category.parentid === cat.id
                 }).length > 0)
                 $scope.content.push(category);
         });
        

        示例plunk here

答案 1 :(得分:0)

尝试这样的事情

替换

@Test

if($scope.cat[i].parentid == categories[i].id)
            {
                $scope.content.push(categories[i]);
            }   

答案 2 :(得分:0)

undefined获得$scope.cat[i],因为即使在将$scope.cat更改为parentId之后,也不会始终执行推送到parentid的代码

if(typeof categories[i] != "undefined" && categories[i].parentid == 0)
{
                $scope.cat.push(categories[i]);
}  

对于数据数组的某些值,这种情况不会成立。所以什么都不会被推到$scope.cat

并记住您的第二个if语句出现在您的第一个if语句之后。所以有时你不会有$scope.cat[i]

对于所有这些值,代码将不会被执行,因为它们没有通过条件

{ id: 2, name: 'raj', parentid: 1 },
{ id: 3, name: 'ram', parentid: 1 },
{ id: 5, name: 'raju', parentid: 4 },       
{ id: 6, name: 'dinesh', parentid: 4 } 

因为parent id不是0

因此,这些是导致undefined

的值

您可以更改为:

var categories = data;
    for(var i =0;i<=categories.length;i++)
    {
        if(typeof categories[i] != "undefined" && categories[i].parentid ==0)
        {
            $scope.cat.push(categories[i]);
        }

    }
    //you will already have you $scope.cat filled then loop through it 
    //checking with the categories array too.

    for(var j=0;j<$scope.cat.length;j++)
    {
       for(var k=0; k<categories.length; k++){
         if($scope.cat[j].parentid==categories[k].id)
         {
           $scope.content.push(categories[k]);
         }
       }
    }

或类似的内容:

var categories = data;

categories = categories
.filter( (category)=>{
   return (category !== []._);  //removes all undefineds in the array
})
.map((category)=>{
  //checks each category from data if is parent_Id is 0 and pushes it to cats array
  //by the end of the operation. the cats array will have some data
  (category.parentId == 0)? ($scope.cats.push(category) , return ) : return;
})
var getContent =(cats,categories)=>{
  var content=[];
  for(var j=0;j<cats.length;j++)
  {
     for(var k=0; k<categories.length; k++){
       if(cats[j].parentid==categories[k].id)
       {
         content.push(categories[k]);
       }
     }
  }
  return content;
}
$scope.content = getContent($scope.cats,categories);