javascript - 基于另一个数组的过滤数组

标签 javascript arrays angularjs

我有一个包含对象列表的列表。每个对象都有 4 个属性。有一个复选框列表,其中包含两个属性的唯一值,这有助于构建我的过滤器数组。

过滤器最终可能看起来像这样:

[
    {
        prop: 'username',
        val: ['max', 'sam']
     },
     {
        prop: 'color',
        val: ['blue', 'green']
     }
]

对象列表看起来像这样:

[
    {
        username: 'sam',
        color: 'blue'
    },
    {
        username: 'jimmy',
        color: 'blue'
    },
    {
        username: 'sam',
        color: 'black'
    },
    {
        username: 'max',
        color: 'green'
    },
    {
        username: 'max',
        color: 'blue'
    }
]

期望的结果

[
    {
        username: 'sam',
        color: 'blue'
    },
    {
        username: 'max',
        color: 'green'
    },
    {
        username: 'max',
        color: 'blue'
    }
]
<小时/>

我感觉自己正陷入一个永无止境的forEach兔子洞。我猜我需要某种递归。目前,这是我所拥有的:

var temporary = scope.transactions;

function getFilteredTransactions() {
    var filter = deviceFilterService.get();

    if (filter.length > 0) {
        var temp2 = [];
        angular.forEach(filter, function (fil) {
            //object
            angular.forEach(fil.val, function (filterValue) {
                //list on each object
                angular.forEach(temporary, function (transaction) {                                 
                    if (transaction[fil.prop] === filterValue) {
                        if (temp2.indexOf(transaction) === -1) {
                            temp2.push(transaction);
                        }
                    }
                });

                temporary = temp2;
            });
        });

        $log.debug(temporary);
        scope.transactions = temporary;
    } else {
        initialize();
    }
}

这开始起作用,第二次遍历 color 属性时,它最终只想将完全相同的事务添加到 temp2 数组中。必须有更好的方法来设置它,可能通过递归。

最佳答案

如果您将第一个列表的格式转换为字典,我认为应该会变得更容易。

var dict = {};
angular.forEach(source1, function(ob){
  dict[ob.prop] = ob.val;
});


function getFiltered(ob){
  for(var prop in ob){
    if(dict[prop] && dict[prop].indexOf(ob[prop]) === -1){
      return false;
    }
  }
 return true;
};

并将其命名为:

var temporary = scope.transactions.filter(getFiltered);

<强> Demo

<小时/>

基本上第一部分转换:

[
    {
        prop: 'username',
        val: ['max', 'sam']
     },
     {
        prop: 'color',
        val: ['blue', 'green']
     }
];

至:

{ 
  username:['max', 'sam'],
  color:['blue', 'green']
 }

这样查找起来就容易多了。

关于javascript - 基于另一个数组的过滤数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30518870/

相关文章:

javascript - 我如何在 CSS 中进行绝对定位?

javascript - filter() 有问题,当我扩展 Array 类时

php - 检索查询中的相似项目

javascript - 无法使用 ng-repeat 循环遍历数组

javascript - 如何在 angular.js 中将 $filter 与 select 一起使用

javascript - 如何用 jQuery 创建固定对话框?

javascript - 适用于 JavaScript 的 Google API 客户端库 - 方法调用时出现 404

objective-c - 静态分析器错误地发现表达式为 "always 0"

javascript - 如何在 AngularJS 中加载时停止过滤自定义过滤器

javascript - jQuery,将所有元素向下移动