Фильтрация массива объектов по массиву строк

111
25 октября 2021, 21:50

Как вернуть значения из массива объектов, применяя фильтры?

У меня есть массив объектов arrayOfObjects:

const arrayOfObjects = [{
    zone: { country: "Cuba" },
    equipment:
    {
        _id: "1",
        name: 'apple',
        filter: 'fresh',
    }
}, {
    zone: { country: "France" },
    equipment:
    {
        _id: "2",
        name: 'orange',
        filter: 'old',
    }
}, {
    zone: { country: "Poland" },
    equipment:
    {
        _id: '3',
        name: 'melon',
        filter: 'withered',
    }
}, {
    zone: { country: "Spain" },
    equipment:
    {
        _id: "4",
        name: 'grapes',
        filter: 'stale',
    }
}]

Есть значения для фильтрации:

let filter = ['fresh', 'stale']

В итоге должно получиться так:

let newArrayOfObjects =  [{
    zone: { country: "Cuba" },
    equipment:
    {
        _id: "1",
        name: 'apple',
        filter: 'fresh',
    }
}, {
    zone: { country: "Spain" },
    equipment:
    {
        _id: "4",
        name: 'grapes',
        filter: 'stale',
    }
}];

Не получается нормальный фильтр написать, вот пример моего кода:

newArrayOfObjects  = arrayOfObjects.filter(function (currentItem) {
    if (_.isMatch(currentItem.equipment, filter)) {
        return true
    }
})
Answer 1

Гибкое решение:

let newArrayOfObjects = filterHelper.call(arrayOfObjects, 
  'equipment.filter', ['fresh' , 'stale']
); 
function filterHelper(propPath, values) {
  const list = Object.fromEntries(values.map(v => [v, true])), 
        path = propPath.split('.');
  const propValOf = obj => path.reduce((r, p) => r[p], obj); 
  return this.filter(o => propValOf(o) in list); 
}
Answer 2

Как-то так:

const filter = ['fresh', 'stale'];
const filterSet = new Set(filter);
const filtered = arrayOfObjects.filter(e => filterSet.has(e.equipment.filter));
READ ALSO
Замена текста jQuery методом replace

Замена текста jQuery методом replace

Кто подскажет, почему это не работает?

172
Как грамотно реализовать код чистыми функциями?

Как грамотно реализовать код чистыми функциями?

Нужно вывести узел с макс/мин значением

152
Почему не работает тернарное условие?

Почему не работает тернарное условие?

Я ожидаю что когда массив пустой он будет показывать Hello worldНо он этого не делает

186
Блок стрелка с использованием SVG

Блок стрелка с использованием SVG

Мне нужно нарисовать красивую заштрихованную стрелку блока, используя SVG из одной точки (x0, y0) в другую (x1, y1), как показано на рисунке

111