首页 > 解决方案 > 使用单键 = 单值和单键 = 多值在数组中过滤数组

问题描述

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,但没有得到正确过滤的结果。

我正在执行我得到 null 的代码,但我期待第一人称 List 对象。

有人可以查看代码并在可能的情况下进行修改,然后将预期结果作为输出发送给我。

标签: javascriptarrays

解决方案


我会建议你把你的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);


推荐阅读