AngularJS过滤器阵列由另一个数组组成

时间:2015-10-22 09:35:31

标签: javascript arrays angularjs filter ionic

我正在使用Ionic混合应用,但我在Javascript / AngularJS中很新。

我有这个数据结构:

  var objects= [
    {
      name: "o1",
      company: {
        id:2,
        fields: [1,6]
      }
    },
    {
      name: "o2",
      company: {
        id:2,
        fields: [3,4,5]
      }
    }
  ];

  var selectedFields= [
    {
      id: 1,
      name: "f1",
    },
    {
      id: 2,
      name: "f2",
    }
  ];

我想过滤包含与objects array中包含的元素对应的ID的company.fields元素(在属性selectedFields array中)。

例如,在这种情况下,我们有2个元素,o1o2o1包含fields 16o2包含fields 34和{ {1}}。 5包含selectedFields array fields ids1,因此在这种情况下,已过滤的2应为对象object }。

这就是我的尝试:

o1

但它说var filteredObjects = filterFilter(objects, selectedFields,function(o, sf){ return angular.forEach(o.company.fields, function (field) { return field.id == sf.is; }); });

和:

o is undefined

var result = []; angular.forEach(objects, function(o){ angular.forEach(o.company.fields, function(f){ angular.forEach(selectedFields, function(sf){ if(sf.id == f.id) { result.push(o); } }); }); }); 永远不会condition if(sf.id == f.id)

有什么想法吗?感谢

2 个答案:

答案 0 :(得分:3)

试试这个:

var test = objects.filter(function (o) {
    return selectedFields.some(function (i) {
        /*
            Some will return true if any of the elements return true
        */
        return i.id === o.company.id; 
    });
});

基本上是过滤Object数组。 .Filter()如果其回调返回true,将使用旧元素创建一个新数组。如果任何任何回调返回true,.some()将执行的操作将返回true。

如果id匹配,.some()返回true,将其传递给.filter()告诉过滤器将该元素添加到新数组中。

.some()是有效的,因为它会在找到匹配结果时停止迭代,回调返回true。虽然.forEach()会继续,但不会返回值。

http://jsfiddle.net/08tvmdyh/

部分文档:https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/some

非常有用的数组方法列表:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array#Methods_2

编辑:我误解了你的问题抱歉。

var test = objects.filter(function (o) {
    return selectedFields.some(function (i) {
        /*
            Some will return true if any of the elements return true
        */
        return o.company.fields.indexOf(i.id) !== -1; //i.id === o.company.id; 
    });
});

我修改了小提琴:http://jsfiddle.net/08tvmdyh/1/

答案 1 :(得分:1)

试试这个:

    var filteredObjects = objects.filter(function(o){

        var fields = o.company.fields,
            matched = false;

        selectedFields.forEach(function(field){
          if(fields.indexOf(field.id) != -1){
            matched = true;
          }
        });

        return matched;
     });

首先尝试理解Javascript中构建的以下3个本机数组函数:

    Array.prototype.filter;
    Array.prototype.forEach;
    Array.prototype.indexOf;