根据另一个数组

时间:2015-05-28 23:44:57

标签: 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数组。必须有一种更好的方法来设置它,可能通过递归。

4 个答案:

答案 0 :(得分:1)

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

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']
 }

这样可以使查看更容易。

答案 1 :(得分:0)

为了清楚起见,您可能希望在此处更改变量名称,但这样做可以满足您的要求:

        var values = {};
        angular.forEach(startingData, function(rawData) {
            angular.forEach(rawData, function(value, key) {
                if (angular.isUndefined(values[key])) {
                    values[key] = [];
                }
                if (values[key].indexOf(value) === -1) {
                    values[key].push(value);
                }
            })
        });
        var result = [];
        angular.forEach(values, function(value, key) {
            result.push({prop: key, val: value})
        });

答案 2 :(得分:0)

您可以简单地迭代需要过滤的数据的每个键,找到每个键的相应过滤器,并根据过滤器值检查值:

get 'users_controller/show'

演示:http://jsfiddle.net/Lz32hka5/1/

答案 3 :(得分:0)

尝试:

var temp2 = [], matched;

angular.forEach(temporary, function(item){
    matched = true;
    angular.forEach(Object.keys(item), function(key){
        angular.forEach(filter, function(filter){
            filter.prop == key && filter.val.indexOf(item[key]) == -1 && (matched = false);
        });
    });
    matched && temp2.push(item);
});

console.log(temp2)

临时是对象列表,过滤器:您的过滤器

演示:http://jsfiddle.net/wZVanG/7wnae850/