打字稿数组对象过滤器

时间:2018-08-22 14:23:38

标签: javascript arrays multidimensional-array filter

我正在尝试过滤角度为5的数组对象,这是我的对象

{
    "id_record": 2,
    "groupName": "PD",
    "count": 15,
    "userList": [{
            "name": "jeffhua",
            "nEmail": "jeffhua@abc.com"
        },
        {
            "name": "joey",
            "nEmail": "joey@abc.com"
        },
        {
            "name": "angelagosto",
            "nEmail": "angelagosto@abc.com"
        }
    ]
}

这是我的过滤器代码

return items.filter(it => {
  return it.userList.filter(dit => {
    return dit.name.toLowerCase().includes(filterText)
  });
});

怎么了?

2 个答案:

答案 0 :(得分:1)

在您的过滤器代码中,第二个过滤器返回一个数组:

return it.userList.filter(dit => {
    return dit.name.toLowerCase().includes(filterText)
  });
// returns array

,并且filter方法等待一个布尔值返回。尝试以下操作:

return items.filter(it => {
  return it.userList.filter(dit => {
    return dit.name.toLowerCase().includes(filterText);
  }).length !== 0;
});

在我的代码段中,我检查内部过滤器结果(数组)是否为空。如果不是,则将true返回给父过滤器,该过滤器会将当前对象保留在结果数组中。


故障(编辑)

以下代码返回一个布尔值,检查用户之一的小写名称是否包含filterText。

return dit.name.toLowerCase().includes(filterText);

然后,此块返回一个数组,其中包含在前面说明的条件下返回true的所有值:

return it.userList.filter(dit => {
    return dit.name.toLowerCase().includes(filterText);
})

但是,要使代码段的父级部分能够过滤数组,它需要一个布尔值作为返回值:

return items.filter(it => {
  return // expect boolean
});

然后,.length !== 0位于末尾:

it.userList.filter(dit => {
    return dit.name.toLowerCase().includes(filterText);
})

将其设置为一个布尔值,应反映您想要的条件。

完整(并带有注释):

// filter returns an array filtered by the method
return items.filter(it => {
  // awaits a boolean return value, with filter returning an array.
  return it.userList.filter(dit => {
    // filter awaits a boolean as return value AND returns a boolean --> ok for filter
    return dit.name.toLowerCase().includes(filterText);
  }).length !== 0; // filter has returned an array, we cast it to boolean while checking if its length is greater than 0.
});

答案 1 :(得分:1)

使用some代替内部filter

  return items.filter(it => {
      return it.userList.some(dit => {
        return dit.name.toLowerCase().includes(filterText)
      });
    });