в любом случае придется пройти по всему массиву, и каждый элемент сравнить, то есть алгоритмы не нужны, хватит встроенных функций JS
data = [
{x: "100", y: "40", z: "first"}, {x: "120", y: "10", z: "second"},
{x: "0", y: "100", z: "second"}, {x: "300", y: "150", z: "third"}
]
filter = {x: {max: "100", min: "20"}, y: {max: "100", min: "20"}, z: ["first", "second"]}
isBetween = (num, bounds) => +num >= +bounds.min && +num <= +bounds.max
data.filter(obj => isBetween(obj.x, filter.x) && isBetween(obj.y, filter.y) && filter.z.includes(obj.z))
// 0: {x: "100", y: "40", z: "first"}