代码之家  ›  专栏  ›  技术社区  ›  Morton

如何过滤包含数组数据的对象的数组?

  •  -1
  • Morton  · 技术社区  · 7 年前

    这是我的数据:

    const sectionDummy = [
      { floor: '1', data: ['A', 'B', 'C']},
      { floor: '2', data: ['D', 'E', 'F']},
      { floor: '3', data: ['G', 'H', 'I']},
    ];
    

    let filterData = [];
    filterData = sectionDummy.filter(item => {
      if (item.floor !== undefined) {
        return item.floor.trim().toLowerCase().indexOf(inputValue) >= 0; 
      }
      return {};
    });
    

    如果 inputValue

    console.log(filterData); // [{ floor: 1, data: ['A', 'B', 'C']}]
    

    如果我也想对数据数组进行过滤,那么我只能使用它。

    我试着用地图

    let filterData = [];
    filterData = sectionDummy.filter(item => {
      if (item.floor !== undefined) {
        item.data.map((value, index) => {
          if(value.trim().toLowerCase().indexOf(inputValue) >=0) {
            return value;
          } else {
            return {};
          }
        });
      }
      return {};
    });
    

    如何过滤两者 floor data array

    任何帮助都将不胜感激。

    1 回复  |  直到 7 年前
        1
  •  1
  •   ttulka    7 年前

    你想先按楼层过滤,然后按数据过滤吗?

    const sectionDummy = [
      { floor: 1, data: ['A', 'B', 'C']},
      { floor: 2, data: ['D', 'E', 'F']},
      { floor: 3, data: ['G', 'H', 'I']},
    ];
    
    const floorFilter = 2;
    const dataFilter = 'E';
    
    const filteredData = sectionDummy
      .filter(item => item.floor === floorFilter)
      .map(({floor, data}) => ({floor, data: data.filter(d => d === dataFilter)}));
      
    console.log(filteredData); //[ { floor: 2, data: [ 'E' ] } ]

    还是按楼层和数据?

    const sectionDummy = [
      { floor: 1, data: ['A', 'B', 'C']},
      { floor: 2, data: ['D', 'E', 'F']},
      { floor: 3, data: ['G', 'H', 'I']},
    ];
    
    const floorFilter = 2;
    const dataFilter = 'E';
    
    const filteredData = sectionDummy
      .filter(({floor, data}) => floor === floorFilter && data.some(d => d === dataFilter))
      
    console.log(filteredData) // [ { floor: 2, data: [ 'D', 'E', 'F' ] } ]
        2
  •  1
  •   Nina Scholz    7 年前

    你可以通过检查来过滤 floor inputValue 取两个值相等的物体。

    let filterData = searchBuildings.filter(({ floor }) => floor === inputValue);
    
        3
  •  1
  •   adiga    7 年前

    您可以使用 reduce 这样:如果 searchText floor ,然后返回整个 section . 否则,如果 存在于 data 大堆

    const sectionDummy = [
      { floor: "1", data: ['A', 'B', 'C']},
      { floor: "2", data: ['D', 'E', 'F']},
      { floor: "3", data: ['G', 'H', 'I']},
    ];
    
    const filter = (sections, searchText) => {
      searchText = searchText.trim().toLowerCase();
      
      return sections.reduce((acc, { floor, data }) => {
        if (floor === searchText) {
          acc.push({ floor, data })
        } else {
          const filtered = data.filter(d => d.toLowerCase().includes(searchText))
          if (filtered.length > 0)
            acc.push({ floor, data: filtered })
        }
    
        return acc;
      }, [])
    }
    
    console.log(filter(sectionDummy, "A"))
    console.log(filter(sectionDummy, "G"))
    console.log(filter(sectionDummy, "1"))