使用单键=单值和单键=多值在数组内过滤数组

时间:2019-04-18 16:15:58

标签: javascript arrays

const personData = {
  personID: 1234567,
  personList: [{
      name: ['name1', 'name2'],
      address: false,
      pin: 12345
    },
    {
      name: ['name1', 'name2', 'name3'],
      address: true,
      pin: 45678
    },
    {
      name: ['name1'],
      address: false,
      pin: 12345
    },
  ]
};

const keys = ['name', 'address', 'pin']
const values = ['name1', 'name2', false, 12345]

let personDataArr = personData.personList.filter(function(e) {
  return keys.every(function(a) {
    return e[a] &&
      e[a].length > 0 ? values.every(x => e[a].includes(x)) : values.includes(e[a])
  });
});

console.log(personDataArr);

代码显示人员数据对象,其中包括名称,地址和密码等信息。

我尝试使用filter,但未得到正确过滤的结果。

我正在执行获取空值的代码,但是我期望第一人称List对象。

有人可以看一下代码,如果可能的话进行修改,然后将预期结果作为输出发送给我。

2 个答案:

答案 0 :(得分:0)

我建议您将key value作为object而不是两个不同的数组

const {personList} = {personID: 1234567,personList: [{name: ['name1', 'name2'],address: false,pin: 12345},{name: ['name1', 'name2', 'name3'],address: true,pin: 45678},{name: ['name1'],address: false,pin: 12345},]};

const filterBy = { name:['name1', 'name2'],address: false,pin:12345 }

let personDataArr = personList.filter(e => {
  return Object.keys(e).every(key => {
    return Array.isArray(e[key]) ? filterBy[key].every(value=> e[key].includes(value)) 
                                 : e[key] === filterBy[key]
  })
})
console.log(personDataArr);

答案 1 :(得分:0)

使用您提供的过滤条件可靠地过滤将变得非常困难。代码应如何确定每个给定键需要哪些值?不可能。

最好以结构化的方式提供值,例如

const filterCriteria = [
  {
    key: 'name',
    values: ['name1', 'name2']
  }, {
    key: 'address',
    value: false
  }, {
    key: 'pin',
    value: 12345
  }
];

const getPerson = (list, criterias) =>
  list.filter(element =>
    criterias.every(criteria =>
      element.hasOwnProperty(criteria.key) &&
      criteria.hasOwnProperty('value') ? 
        element[criteria.key] === criteria.value :
        (criteria.values.every(value => element[criteria.key].includes(value))) && element[criteria.key].every(value => criteria.values.includes(value)))
  );

console.log(getPerson(personData.personList, filterCriteria));
<script>
const personData = {
  personID: 1234567,
  personList: [
    {
      name: ['name1', 'name2'],
      address: false,
      pin: 12345
    },
    {
      name: ['name1', 'name2', 'name3'],
      address: true,
      pin: 45678
    },
    {
      name: ['name1'],
      address: false,
      pin: 12345
    },
  ]
};

const filterCriteria = [
  {
    key: 'name',
    values: ['name1', 'name2']
  }, {
    key: 'address',
    value: false
  }, {
    key: 'pin',
    value: 12345
  }
];
</script>