【问题标题】:filter array of objects based on separate object keys, values根据单独的对象键、值过滤对象数组
【发布时间】:2019-07-22 23:41:25
【问题描述】:

我在下面有一组人:

  const FIRST_ARRAY = [
    {
      name: 'Simon',
      age: 32,
      occupation: 'Student'
    },
    {
      name: 'Vera',
      age: 22,
      occupation: 'Developer'
    }
  ];

我想过滤数组以根据“过滤器”对象生成一个单独的数组。

例如,如果我的过滤器是:

  const FILTERS = {
    age: 32,
    name: 'John',
    occupation: ''
  };

新数组应该是空的,因为数组中没有人拥有 32 和 John 的组合。但是,如果我的过滤器是:

 const FILTERS = {
    age: 32,
    name: 'Simon',
    occupation: ''
  }

返回的新人员数组将是:

 const NEW_ARRAY = [
    {
      name: 'Simon',
      age: 32,
      occupation: 'Student'
    }
  ];

如何通过迭代“过滤器”对象值来过滤人员数组?请记住,过滤器的键和值会一直动态变化。

【问题讨论】:

  • 你实际上并没有问任何问题。
  • occupation: '' 作为过滤器值具有误导性。省略一个属性会更合乎逻辑。
  • occupation 是否需要作为过滤器?
  • 这不是正常的搜索/过滤吗?比如 Filter_Array.where(f=>(f.age== age || isnullorEmpty(age)) && (f.name == name || isnullorEmpty(name)) && (c.occupation ==occupation || isnullorEmpty(occupation )));用javascript修改,但逻辑应该类似
  • 如果字符串为空,可以省略占用。但是它将存在于过滤器对象中。

标签: javascript arrays object filter javascript-objects


【解决方案1】:

您可以按如下方式过滤:

const FIRST_ARRAY = [
  {
    name: 'Simon',
    age: 32,
    occupation: 'Student'
  },
  {
    name: 'Vera',
    age: 22,
    occupation: 'Developer'
  }
];

const FILTERS = {
  name: 'Simon',
  age: 32,
  occupation: ''
};

const filtered = FIRST_ARRAY.filter(person => Object.entries(FILTERS)
  .every(([key, val]) => val !== '' ? person[key] === val : true));
  
console.log(filtered);

【讨论】:

    【解决方案2】:

    您可以使用函数filter 和函数every 来检查每个键值是否等于FILTERS 值。

    假设过滤器中的值为空,然后跳过它

    const FIRST_ARRAY = [{name: 'Simon',age: 32,occupation: 'Student'},{name: 'Vera',age: 22,occupation: 'Developer'}],
          FILTERS = {age: 32,name: 'Simon',occupation: ''},
          keys = Object.keys(FILTERS),
          result = FIRST_ARRAY.filter(o => keys.every(k =>  FILTERS[k] === '' || FILTERS[k] === o[k]));
    
    console.log(result);
    .as-console-wrapper { max-height: 100% !important; top: 0; }
    const FILTERS = { age: 32, name: 'John', occupation: '' };

    【讨论】:

      【解决方案3】:

      你可以试试这样的:

          function compare(item, filter) {
            for (var property in filter) {
              if (filter.hasOwnProperty(property)) {
                let value = filter[property];
                return item.hasOwnProperty(property) && item[property] != '' && value == item[property];
              }
            }
          }
          
          const DATA = [
              {
                name: 'Simon',
                age: 32,
                occupation: 'Student'
              },
              {
                name: 'Vera',
                age: 22,
                occupation: 'Developer'
              }
            ];
            
          const filter = {
              age: 32,
              name: 'Simon',
              occupation: ''
            };
            
          let result = DATA.filter(function(item) {
              return compare(item, filter);
            })
            
            console.log(result);

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-01-12
        • 2019-05-03
        • 2021-11-07
        • 2018-12-25
        • 1970-01-01
        • 1970-01-01
        • 2021-03-21
        相关资源
        最近更新 更多