如何通过嵌套数组的对象字段值过滤数组?

时间:2019-01-10 08:49:29

标签: javascript arrays

我有一个对象数组。每个对象包含另一个数组。 如何通过嵌套aParticipants数组的sFullName的值过滤aParticipants数组?

const filterString = '';
const aParticipants = [{
    'iRoleId': 1,
    'aParticipants': [{
      'iId': 1,
      'sFullName': 'Jimmy'
    }]
  },
  {
    'iRoleId': 2,
    'aParticipants': [{
        'iId': 2,
        'sFullName': 'Tomas'
      },
      {
        'iId': 3,
        'sFullName': 'Stanley'
      }
    ]
  }
]

我尝试过这种方法:

const aFilteredParticipants = [...aParticipants].filter(employeeBlock => {
employeeBlock.aParticipants = employeeBlock.aParticipants.filter( item => 
{
return item.sFullName.toLowerCase().includes(filterString.toLowerCase());
});
return employeesBlock.aParticipants.length;
}

在这里,我通过过滤嵌套数组后剩余的长度来过滤父数组。然后通过检查字段sFullName中是否包含filterString来过滤嵌套数组。

第一次过滤后输出正确。但是在首先过滤父数组aParticipants的对象中的嵌套数组aParticipants之后,将其值更改为[]空数组。 虽然我正在使用传播算子复制初始数组。

2 个答案:

答案 0 :(得分:0)

  

const aFilteredParticipants = [... aParticipants] .filter(employeeBlock

您不需要[...aParticipants] aParticipants 已经是一个数组,因此不会有任何区别。

您可以使用以下

const filterString = 'Jimmy';
const aParticipants = [{
    'iRoleId': 1,
    'aParticipants': [{
      'iId': 1,
      'sFullName': 'Jimmy'
    }]
  },
  {
    'iRoleId': 2,
    'aParticipants': [{
        'iId': 2,
        'sFullName': 'Tomas'
      },
      {
        'iId': 3,
        'sFullName': 'Stanley'
      }
    ]
  }
]

filteredParticipants = aParticipants.filter( x => {
  var isValid = false;

  [].concat(x.aParticipants).some(z => {
    if (z.sFullName.toLowerCase().indexOf(filterString.toLowerCase()) !== -1) {
      isValid = true;
    }

    return isValid;
  })

  return isValid;
})
console.log(filteredParticipants)

答案 1 :(得分:0)

const filterString = '';

const aParticipants = [{
    'iRoleId': 1,
    'aParticipants': [{
      'iId': 1,
      'sFullName': 'Jimmy'
    }]
  },
  {
    'iRoleId': 2,
    'aParticipants': [{
        'iId': 2,
        'sFullName': 'Tomas'
      },
      {
        'iId': 3,
        'sFullName': 'Stanley'
      }
    ]
  }
]

// here we are checking that a sFullName contains our filter
const fullNameContains = filter => participant =>
  participant.sFullName.toLowerCase().includes(filter.toLowerCase())
  
// here we verify that at least one of the aParticipants sub array contains the filter
const hasFullNames = filter => employeeBlock =>
  employeeBlock.aParticipants.some(fullNameContains(filterString))

// here we filter participants
const aFilteredParticipants = aParticipants.filter(hasFullNames(filterString))

console.log('aFilteredParticipants', aFilteredParticipants);