比较angularJs中的两个列表

时间:2016-03-23 16:25:00

标签: angularjs

我有两个来自两个不同json对象的列表:

<ul ng-repeat="a in user.data">
    <li>
        <md-checkbox>
              {{ a.name }}
         </md-checkbox>
    </li>
</ul>

和:

<ul ng-repeat="x in job.data">
    <li>
        <md-checkbox>
              {{ x.user.name }}
         </md-checkbox>
    </li>
</ul>

我必须比较两个列表并删除与{{ a.name }}相同的{{ job.user.name }}。比较具有不同结构的json对象很难。如何比较这两个列表并删除重复的项目?

4 个答案:

答案 0 :(得分:3)

您可以使用函数而不是表达式参数中的字符串来使用filter过滤器;)。请记住,这是filter

的语法
{{ filter_expression | filter : expression : comparator}}

expression可以是字符串,对象或函数。像这样的东西会做

$scope.filterUnemployed = function(value) {
    var jobs = $scope.job.data;
    for (var i = 0; i < jobs.length; i++) {
        // Search every object in the job.data array for a match. 
        // If found return false to remove this object from the results
        if (jobs[i].user.name === value.name) {
            return false;
        }
    }
    // Otherwise return true to include it
    return true;
}

然后将过滤器应用于ng-repeat指令,就像这样

<ul ng-repeat="a in user.data | filter:filterUnemployed">
    <li>
        <md-checkbox>
            {{ a.name }}
        </md-checkbox>
    </li>
</ul>

请注意,这不会修改您的原始集合,但会导致在html中显示新的副本beign,因为这通常是所需的效果。

检查样本是否有工作演示

&#13;
&#13;
angular.module('app', [])
  .controller('SampleCtrl', function($scope) {
    $scope.user = {
      data: [{
        name: 'John'
      }, {
        name: 'Mary'
      }, {
        name: 'Peter'
      }, {
        name: 'Jack'
      }, {
        name: 'Richard'
      }, {
        name: 'Elizabeth'
      }]
    };
    $scope.job = {
      data: [{
        jobTitle: 'CEO',
        user: {
          name: 'John'
        }
      }, {
        jobTitle: 'CFO',
        user: {
          name: 'Mary'
        }
      }, {
        jobTitle: 'Analist',
        user: {
          name: 'Jack'
        }
      }]
    };
    $scope.filterUnemployed = function(value) {
      var jobs = $scope.job.data;
      for (var i = 0; i < jobs.length; i++) {
        if (jobs[i].user.name === value.name) {
          return false;
        }
      }
      return true;
    }
  });
&#13;
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<div ng-app="app" ng-controller="SampleCtrl">
  <h1>All Users</h1>
  <ul ng-repeat="a in user.data">
    <li>
      <md-checkbox>
        {{ a.name }}
      </md-checkbox>
    </li>
  </ul>
  <h1>Unemployed users</h1>
  <ul ng-repeat="a in user.data | filter:filterUnemployed">
    <li>
      <md-checkbox>
        {{ a.name }}
      </md-checkbox>
    </li>
  </ul>
  <h1>Employed</h1>
  <ul ng-repeat="x in job.data">
    <li>
      <md-checkbox>
        {{ x.user.name }}
      </md-checkbox>
    </li>
  </ul>
</div>
&#13;
&#13;
&#13;

答案 1 :(得分:1)

这样的事情应该会有所帮助:

for(i=0; i<user.data.length;i++){
    for(j=0; j<job.data.length;j++){
        if(user.data[i].name === job.data[j].name){
            user.date.splice(i,1);
        }
    }
}

我很感激一些反馈,至少知道我的代码帮助了你

答案 2 :(得分:1)

您可以通过过滤其中一个阵列来创建新阵列:

var newArray = job.data.filter(function(jobData) {
    return user.data.some(function(userData) {
         return userData.name === jobData.user.name;
    });
});

答案 3 :(得分:1)