【问题标题】:Filter an array based on another array. (Using React)根据另一个数组过滤一个数组。 (使用反应)
【发布时间】:2021-02-25 23:05:42
【问题描述】:

目标是根据用户选择的插槽过滤数组。

例如,一个数组有 7pm-9pm、10pm-12pm 等时段。

现在用户选择 7pm-9pm,所以现在我想过滤具有 7ppm-9pm 或者用户想要的数组 7pm-9pm 和 10pm-11pm 所以数据应该基于 7pm-9pm 和 10pm-11pm

这是我存储值的方式

这是原始数组

data :[ 
       {
        name:"something",
        phone:"another",
        extraDetails : {
            // some more data
           slots : [
               {item:"6PM-7PM"},
               {item:"7PM-8pm}
              ]
            }          
       },{
           // Similarly more array with similar data but somewhere slots might be null
}
      ]
   

现在例如我们有这个数组

 slots:[{6PM-7PM,9PM-10PM,11PM-12AM}]

现在这应该过滤所有那些包括 6PM-7PM、9PM-10PM、11PM-12AM 的时间段

或者如果用户选择 slots:[{6PM-7PM}]

我们仍然应该得到包含下午 6 点到 7 点更多的结果,否则无关紧要。

【问题讨论】:

    标签: javascript arrays reactjs filtering


    【解决方案1】:

    首先,为了简单起见,我建议您将其用于您的插槽表示,但您可以根据您的实际代码更改此方法:

    slots: ['6PM-7PM', '9PM-10PM', '11PM-12PM']

    然后你可以遍历你的数据并使用过滤器:

    const querySlots = ['6PM-7PM', '9PM-10PM', '11PM-12PM'];
    
    const matchedPersonsWithSlots = data.filter( (person) => {
      let i = 0;
      while ( i < person.extraDetails.slots.length ) {
        if (querySlots.includes(person.extraDetails.slots[i]) return true;
        i += 1;
      }
    
      return false;
    });
    

    matchedPersonsWithSlots 将拥有与您的查询中的一个插槽匹配的插槽的所有人员,因为如果任何查询插槽在某人的插槽列表中,那么它就会包含在结果集中。

    编辑以包含不同的用例

    但是,如果查询数组中的每个槽都必须匹配,那么过滤必须以不同的方式进行,但代码更少。

    const matchedPersonsWithAllSlots = data.filter(person =>
      querySlots.every((qSlot)=>person.extraDetails.slots.includes(qSlot)));
    

    以上将遍历您数据中的每个人,并针对每个人,确定该人是否拥有您的所有查询槽,并将其包含在结果列表中,前提是这是真的。

    【讨论】:

    • 这可行,但如果数据包括 6PM-7PM 但不包括 9PM-10PM,它仍然返回值
    • @PulkitGupta 我已经编辑了答案以包括查询中的每个插槽都必须包含在一个人的可用插槽中的情况。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-30
    • 2014-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-11
    相关资源
    最近更新 更多