过滤数组时JS过滤器无法正常工作

Posted

技术标签:

【中文标题】过滤数组时JS过滤器无法正常工作【英文标题】:JS filter doesn't work properly when filtering an array 【发布时间】:2019-11-12 17:31:00 【问题描述】:

在我的 react native 应用程序中,我有以下数组。

export const ID_OPTIONS = [
   id: 'nric_fin', name: 'NRIC/FIN' ,
   id: 'passport', name: 'Passport' ,
   id: 'birth_cert', name: 'Birth Certificate' ,
];

我尝试如下过滤这个数组。

setSelectedIdType = (idType) => 
  return ID_OPTIONS.filter((type) => 
    if (type.id === idType) 
      return type.name;
    
    return null;
  );

但是,这会返回一个对象。我想得到名字作为结果。我在这里做错了什么?

【问题讨论】:

过滤器返回类型用作布尔值来确定当前元素是否应该保留。你希望你的函数做什么?这个名字令人困惑,它没有设置任何东西,只是找到了一些东西。您只想要返回的名称吗?一组名称? 【参考方案1】:

看起来更像是在寻找 for 循环:

setSelectedIdType = (idType) => 
  for (let type of ID_OPTIONS) 
    if (type.id === idType) 
      return type.name;
    
  
  return null;

可以使用find实现等价:

setSelectedIdType = (idType) => 
  let type = ID_OPTIONS.find(type => type.id === idType);
  return type && type.name;

(当找不到 id 时,这将返回 undefined 而不是 null;如有必要,type === undefined ? null : type.name 之类的东西会改变它。)

【讨论】:

【参考方案2】:

A filter 过滤数组中的元素......无论您返回的确切内容是什么,返回值都将被简单地视为“真实”或“虚假”(函数返回的元素保留“真实”值,丢弃其他值)。

所有非空字符串在 javascript 中都是“真实的”。

【讨论】:

【参考方案3】:

只使用Array.find 而不是Array.filter,因为filter 返回过滤后的数组而不是一项。 Array.find 返回第一个匹配的项目,然后您可以在其上获取 name

根据Array.filter docs - 返回值

包含通过测试的元素的新数组。如果没有元素通过 测试,会返回一个空数组。

关于test 函数,Array.filter 每次迭代都会执行:

函数是一个谓词,用来测试数组的每个元素。返回 true 保留元素,false 否则。

注意返回值是boolean

使用Array.find,您的功能可能只是:

const ID_OPTIONS = [  id: 'nric_fin', name: 'NRIC/FIN' ,  id: 'passport', name: 'Passport' ,  id: 'birth_cert', name: 'Birth Certificate' , ];

let setSelectedIdType = idType => 
  (ID_OPTIONS.find(x => x.id === idType) || ).name

console.log(setSelectedIdType('nric_fin'))
console.log(setSelectedIdType('passport'))

【讨论】:

【参考方案4】:

之后只需map 数组即可获得name

return ID_OPTIONS.filter(...).map(( name ) => name);

您也可以使用reduce 来降低复杂性:

setSelectedIdType = idType => ID_OPTIONS.reduce((a,  id, name ) => id == idType ? (a.push(name), a) : a, []);

【讨论】:

【参考方案5】:

引用Mozilla Filter Function Docs

callback 函数是一个谓词,用来测试数组的每个元素。返回 true 以保留元素,否则返回 false。

Return value 包含通过测试的元素的新数组。如果没有元素通过测试,则返回一个空数组。

我认为过滤器的回调不能是布尔值 而返回值应该是一个包含过滤器函数匹配结果的数组

【讨论】:

【参考方案6】:

您的域是否有必要将对象存储在数组中?

由于您已将它们声明为常量,因此我将假设它们不会改变,除非重新加载客户端。

如果您要将这个对象数组转换为像这样的简单对象:

const NAMES = ID_OPTIONS.reduce((obj,idOption) => 
  obj[idOption.id] = name: idOption.name;
  return obj;
,);

这将导致:


  nric_fin: name: 'NRIC/FIN',
  passport: name: 'Passport',
  birth_cert:  name: 'Birth Certificate'

现在您可以通过属性访问名称

let idType = 'passport';
NAMES[idType];

【讨论】:

以上是关于过滤数组时JS过滤器无法正常工作的主要内容,如果未能解决你的问题,请参考以下文章

NSPredicate 对象模型数组过滤器在 Swift 4.0 中无法正常工作

Magnolia:启用缓存过滤器导致 Facebook 共享无法正常工作时,范围请求不提供内容

数据表过滤器在应用SQL Server 2008分页代码时无法正常工作

剑道下拉过滤器无法正常工作

Logstash 日期过滤器无法正常工作

django - 自定义过滤器无法正常工作