首页 > 解决方案 > javascript:使用函数方法通过数组的多个值过滤对象

问题描述

我正在尝试使用值列表和键列表搜索对象列表。我的第一种方法是创建一个给定特定值的对象列表。但是,密钥是硬编码的,我应该使用更实用的方法。接下来,我认为我应该在为每个值过滤后创建一个对象列表。但是,我再次对这些值进行硬编码。我不确定如何传递值列表和键列表,如下所示。我应该使用 Map 对象吗?如果是这样,我怎样才能提取以下两个变量?:

const list_of_keys = ['color_1', 'color_2', 'color_3']
const list_of_values =  ['red','blue','purple']`
const data = [
    {make: 'ford',model: 'mustang',color_1: 'red',color_2: '',color_3: ''},
    {make: 'ford',model: 'escape',color_1: '',color_2: 'blue',color_3: ''},
    {make: 'ford',model: 'expedition',color_1: '',color_2: '',color_3: 'purple'},
    {make: 'mercedez',model: 'helicopter',color_1: '',color_2: '',color_3: 'orange'}
]

// hard-coded object keys
const filter_by_multiple_keys = (carObject, Value) => carObject.filter(car =>
    car.color_1 === Value ||
    car.color_2 === Value ||
    car.color_3 === Value
    );

// hard-coded values
const filterByColorsObject = list_of_objects => {

    const dataArray = [];

    dataArray.push(filter_by_multiple_keys(list_of_objects, 'red'));
    dataArray.push(filter_by_multiple_keys(list_of_objects, 'blue'));
    dataArray.push(filter_by_multiple_keys(list_of_objects, 'purple'));

    return(dataArray)

}

console.log(filterByColorsObject(data))

标签: javascriptdictionaryfilterfunctional-programmingreduce

解决方案


创建一个键名数组是正确的想法 -.some当在对象上访问该属性时,检查它们是否等于值:

const filter_by_multiple_Columns = (carObject, value) => carObject.filter(
  car => list_of_keys.some(
    key => car[key] === value
  )
);

.map要从数组构造多个列list_of_values

const filterByColorsObject = list_of_objects => list_of_values.map(
  value => filter_by_multiple_Columns(list_of_objects, value)
);

但这是一个极其奇怪的数据结构。如果可能,请将colors属性更改为数组,而不是多个单独的属性:

{ make: 'mercedez',model: 'helicopter', colors: ['', '', 'orange'] }

或者

{ make: 'mercedez',model: 'helicopter',colors: ['orange'] }

这将使它们更容易迭代。对于上述情况,您将执行以下操作:

const filter_by_multiple_Columns = (carObject, Value) => carObject.filter(
  car => car.colors.includes(Value)
);

推荐阅读