【问题标题】:filter by multiple array by matching object properties通过匹配对象属性按多个数组过滤
【发布时间】:2017-04-11 13:00:11
【问题描述】:

通过单个值很容易摆脱不匹配的对象属性,例如

const person = [
  {name:'james',gender:'male'},
  {name:'john',gender:'male'},
  {name:'chun li',gender:'female'}
]
const gender = ['male'];

let filtered = person.filter( obj => obj.gender === 'male');

console.log(filtered)

但是如果性别都存在,比如['male', 'female'],会怎样?在这种情况下是否有任何 loadash 方法可以提供帮助?

【问题讨论】:

  • 你可以查看性别数组中的indexOf obj.gender,像这样:let filtered = person.filter( obj => gender.indexOf(obj.gender) === -1);
  • 小心,'female'.indexOf('male') 是 2
  • let filtered = person.filter( obj => obj.gender === 'male' || (typeof obj.gender === 'object' && obj.gender.indexOf('male') !== -1)); 怎么样?
  • @haipham23 是否可以不对字符串进行硬编码?假设我的列表是手机品牌列表,其中有 50 多个。

标签: javascript reactjs lodash


【解决方案1】:

过滤器的工作方式是简单地为其提供一个函数,该函数为您想要保留的对象返回 true (docs)。考虑到这一点,如果性别是 malefemale,您需要做的就是返回 true。

let filtered = person.filter((entry) => {
    return (entry.gender == 'male') || (entry.gender == 'female');
})

【讨论】:

  • 这是不可扩展的,想象它是手机的品牌,你有超过 2 项在数组中
  • 你是对的,我没有意识到你正在计划一个包含 100 多个项目的数组 :)
【解决方案2】:

使用_.includes

const genders = ['male', 'female'];
let filtered = person.filter(obj => _.includes(genders, obj.gender));

【讨论】:

  • 嘿,这还不错,如果列表超过 100 项也没问题?
  • 在内部,它使用 o(1) 对数组中的每个元素进行相等性检查,因此需要 o(n)。 Lodash 也会小心或无检查等等。
  • 这可能会有所帮助,包括 vs indexof jsperf.com/lodash-includes-vs-indexof/2
【解决方案3】:

您也可以使用 [].indexOf 来获得想要的结果。

const person = [
  {name:'james', gender:'male'},
  {name:'john', gender:'male'},
  {name:'chun li', gender:'female'}
]
const gender = ['male', 'female'];

person.filter((obj) => gender.indexOf(obj.gender)> -1 );

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-12-02
    • 2022-01-11
    • 2017-11-03
    • 2020-04-21
    • 1970-01-01
    • 1970-01-01
    • 2019-01-17
    • 2019-05-29
    相关资源
    最近更新 更多