javascript: фильтровать объекты по нескольким значениям с массивом, используя функциональный подход - PullRequest
0 голосов
/ 01 марта 2020

Я пытаюсь найти список объектов, используя список значений и список ключей. Мой первый подход заключается в создании списка объектов с заданным значением. Однако ключ жестко закодирован, и я должен использовать более функциональный подход. Далее, я думаю, что я должен создать список объектов после фильтрации для каждого значения. Тем не менее, я снова жестко кодирую значения. Я не уверен, как передать список значений и список ключей, таких как следующие. Должен ли я использовать объект карты? если так, как я могу извлечь следующие две переменные?:

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))

1 Ответ

2 голосов
/ 01 марта 2020

Создание массива имен ключей - правильная идея - проверьте, равны ли .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)
);
...