比较两个列表并使用角度js删除常用元素

时间:2015-10-19 17:17:53

标签: javascript arrays angularjs html5 list

我有两个列表如下

  

list1 =   ['选项1''选项2''选项3''选项4''选项5','选项6''选项7'];

     

list2 = [' option3',' option4',' option7'];

我希望列表

  

listFinal = [' option1',' option2',' option5',' option6',' option7' ];

请使用角度js给我建议如何使用过滤器解决此问题

尝试使用此代码使用过滤器解决此问题,但无法成功。

app.filter('unique', function() {
   return function(collection, keyname) {
      var output = [], 
          keys = [];

  angular.forEach(collection, function(item) {
      var key = item[keyname];
      if(keys.indexOf(key) === -1) {
          keys.push(key);
          output.push(item);


     }
      });
      return output;
   };
});

2 个答案:

答案 0 :(得分:1)

我不确定你真的想要一个过滤器。这是你应该在Angular之外解决的问题。如果您愿意将lodash添加到项目中,您可以这样做:

var diff = _.difference(array1, array2);

如果你必须使用过滤器,你可以试试这样的东西吗?

app.filter('difference', function() {
     return function(input, diff_array) {
        var result = [];
        for (var i = 0; i < input.length; i++) {
            if (diff_array.indexOf(input[i]) == -1) {
                result.push(input[i]);
            }
        }
        return result;
     }
 }

请注意,如果您这样做,您的模板必须类似于:

{{ input | difference:diff_arr }}

我实际上没有测试任何这个,但这应该是一般的想法。我同意Phillip的说法,这不是你应该在Angular中尝试解决的问题。

答案 1 :(得分:0)

您所描述的是“数组/集合差异”。 StackOverflow上有很多问题已经问过这个问题了。这与Angular.js无关,但是算法解决方案存在问题。只是为了添加一些有趣的材料,一个“天真”的解决方案在O(nlogn)中运行,它将是:

  • 将两个列表/数组从lowests排序到最高
  • 遍历每个数组,最初将内部指针设置为0,比较元素。如果数组A中的元素大于数组B中的on,则在数组B中将指针前进1,否则为B,否则如果它们相等,则从数组中删除结果并推进两个指针

What is the fastest or most elegant way to compute a set difference using Javascript arrays?

JavaScript array difference