过滤并显示嵌套的对象数据

时间:2019-03-02 23:05:44

标签: javascript arrays sorting object vue.js

我有一个需要过滤的对象数组,并根据选中的复选框进行显示。我可以使它与一维数组一起使用,当我更深入地嵌套时,我不知道如何使所有内容重新工作。

这是过滤数组的初始函数:

computed: {
selectedFilters: function() {
  let filters = [];
  let checkedFilters = this.shopFilters.filter(obj => obj.checked);
  checkedFilters.forEach(element => {
    filters.push(element.value);
  });
  return filters;
 }
}

Tis是它从中提取的数据:

shopFilters: [
    {
      name: 'price',
      categories: [
      {
        checked: false,
        value: 'Under $50'
      },
      {
        checked: false,
        value: '$50 to $100'
      },
      {
        checked: false,
        value: '$100 to $150'
      },
      {
        checked: false,
        value: '$150 to $200'
      },
      {
        checked: false,
        value: 'Over $200'
      },
      ]
    },
    {
      name: 'sports',
      categories: [
      {
        checked: false,
        value: 'lifestyle'
      },
      {
        checked: false,
        value: 'running'
      },
      {
        checked: false,
        value: 'basketball'
      },
      {
        checked: false,
        value: 'football'
      },
      {
        checked: false,
        value: 'soccer'
      },
      {
        checked: false,
        value: 'training & gym'
      },
      {
        checked: false,
        value: 'skateboarding'
      },
      {
        checked: false,
        value: 'baseball / softball'
      },
      {
        checked: false,
        value: 'golf'
      }
      ]
    }
  ]

此功能可过滤另一个文件中的产品数据以显示在页面上

    methods: {
    getfilteredData: function() {
      this.filteredData = data;
      let filteredDataByfilters = [];
      // first check if filters where selected
      if (this.selectedFilters.length > 0) {
        filteredDataByfilters= this.filteredData.filter(obj => this.selectedFilters.every(val => obj.indexOf(val) >= 0));
        this.filteredData = filteredDataByfilters;
      }
    }
   }

数据如下:

const data = [
{
    name: 'SNKR 001',
    gender: 'Men',
    price: 100,
    sport: 'running',
    width: 'Wide',
    colors: ['black', 'white', 'green', 'pink'],
    sizes: [3, 3.5, 4, 4.5, 5, 5.5, 6, 6.5, 7, 7.5, 8, 8.5, 9, 9.5, 10, 10.5, 11, 11.5, 12, 12.5, 13, 14, 15],
    image: '../assets/images/shoe-1.png'
},
{
    name: 'SNKR 002',
    gender: 'Men',
    price: 100,
    sport: 'running',
    width: 'Wide',
    colors: ['black', 'white', 'green', 'pink'],
    sizes: [3, 3.5, 4, 4.5, 5, 5.5, 6, 6.5, 7, 7.5, 8, 8.5, 9, 9.5, 10, 10.5, 11, 11.5, 12, 12.5, 13, 14, 15],
    image: '../assets/images/shoe-1.png'
},
{
    name: 'SNKR 003',
    gender: 'Men',
    price: 100,
    sport: 'training & gym',
    width: 'Wide',
    colors: ['black', 'white', 'green', 'pink'],
    sizes: [3, 3.5, 4, 4.5, 5, 5.5, 6, 6.5, 7, 7.5, 8, 8.5, 9, 9.5, 10, 10.5, 11, 11.5, 12, 12.5, 13, 14, 15],
    image: '../assets/images/shoe-1.png'
},
{
    name: 'SNKR 004',
    gender: 'Men',
    price: 100,
    sport: 'lifestyle',
    width: 'Wide',
    colors: ['black', 'white', 'green', 'pink'],
    sizes: [3, 3.5, 4, 4.5, 5, 5.5, 6, 6.5, 7, 7.5, 8, 8.5, 9, 9.5, 10, 10.5, 11, 11.5, 12, 12.5, 13, 14, 15],
    image: '../assets/images/shoe-1.png'
}
];
export default data;

1 个答案:

答案 0 :(得分:1)

您可以将所有过滤器合并为1个数组:

const categories = this.shopFilters.map(item => item.categories)
const flatFilters = [].concat.apply([], categories)

然后过滤器将变平:

flatFilters: [{
    checked: false,
    value: 'Under $50'
  },
  {
    checked: false,
    value: '$50 to $100'
  },
  {
    checked: false,
    value: '$100 to $150'
  },
  {
    checked: false,
    value: '$150 to $200'
  },
  {
    checked: false,
    value: 'Over $200'
  },
  {
    checked: false,
    value: 'lifestyle'
  },
  {
    checked: false,
    value: 'running'
  },
  {
    checked: false,
    value: 'basketball'
  },
  {
    checked: false,
    value: 'football'
  },
  {
    checked: false,
    value: 'soccer'
  },
  {
    checked: false,
    value: 'training & gym'
  },
  {
    checked: false,
    value: 'skateboarding'
  },
  {
    checked: false,
    value: 'baseball / softball'
  },
  {
    checked: false,
    value: 'golf'
  }
]

然后使用可以应用旧逻辑

computed: {
  selectedFilters: function() {
    let filters = [];
    const categories = this.shopFilters.map(item => item.categories)
    const flatFilters = [].concat.apply([], categories)
    let checkedFilters = flatFilters.filter(obj => obj.checked);
    checkedFilters.forEach(element => {
      filters.push(element.value);
    });
    return filters;
  }