Reputation: 137
I have an array of objects with latitude and longitude stored like this and filter array of arrays containing latitudes and longitudes. I want to filter my data based on latitudes and longitudes.
var data = [{LatLng:[34.09755005, -118.2900766],all_time: 22, wait_list: 217}
{LatLng:[21.30799045, -157.853676],all_time: 23, wait_list: 210},
{LatLng:[36.0678305, -110.2900766],all_time: 19, wait_list: 237},
{LatLng:[26.0665546, -130.8946739],all_time: 15, wait_list: 307}
]
I have another array of arrays which I am using as filters
var nearest_array = [[21.30799045, -157.853676],[26.0665546, -130.8946739]]
The result array should be this--
var result_array = [{LatLng:[26.0665546, -130.8946739],all_time: 15, wait_list: 307},{LatLng:[21.30799045, -157.853676],all_time: 23, wait_list: 210}]
I tried something but nothing seems to work--
data.filter(x => x.LatLng.some(g => nearest_array.includes(g)))
data.filter(x => nearest_array.includes(x.LatLng))
Upvotes: 1
Views: 494
Reputation: 18525
You can do this with Array.filter
, Array.some
and Array.every
:
const data = [{ LatLng: [34.09755005, -118.2900766], all_time: 22, wait_list: 217 }, { LatLng: [21.30799045, -157.853676], all_time: 23, wait_list: 210 }, { LatLng: [36.0678305, -110.2900766], all_time: 19, wait_list: 237 }, { LatLng: [26.0665546, -130.8946739], all_time: 15, wait_list: 307 } ]
const filters = [ [21.30799045, -157.853676], [26.0665546, -130.8946739] ]
const result = data.filter(({LatLng}) =>
filters.some(f => LatLng.every(l => f.includes(l))))
console.log(result)
The idea is to first filter the main array and inside of that filter to make sure that at least one of the filters
has all of its elements matched in the LatLng
array.
Upvotes: 4
Reputation: 33736
You can use the function filter
and check for the latitude
and longitude
using the function some
, this is for checking at least one object containing those coordinates.
var data = [{LatLng:[34.09755005, -118.2900766],all_time: 22, wait_list: 217},{LatLng:[21.30799045, -157.853676],all_time: 23, wait_list: 210},{LatLng:[36.0678305, -110.2900766],all_time: 19, wait_list: 237},{LatLng:[26.0665546, -130.8946739],all_time: 15, wait_list: 307}],
nearest_array = [[21.30799045, -157.853676],[26.0665546, -130.8946739]],
result = data.filter(({LatLng: [lat, lon]}) => nearest_array.some(([ilat, ilon]) => lat === ilat && lon === ilon));
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
Upvotes: 1
Reputation: 371193
Rather than filter
, you might .map
from your nearest_array
, and .find
the associated LatLng
item - .map
is a bit more appropriate if your input array and output array are one-to-one:
var data=[{LatLng:[34.09755005,-118.2900766],all_time:22,wait_list:217},{LatLng:[21.30799045,-157.853676],all_time:23,wait_list:210},{LatLng:[36.0678305,-110.2900766],all_time:19,wait_list:237},{LatLng:[26.0665546,-130.8946739],all_time:15,wait_list:307}];var nearest_array=[[21.30799045,-157.853676],[26.0665546,-130.8946739]]
const output = nearest_array.map((numsToFind) => {
const joined = numsToFind.join(',');
return data.find(({ LatLng }) => LatLng.join(',') === joined);
});
console.log(output);
(Non-primitives, like objects, arrays, and functions, are not equal to each other unless they reference the same item in memory - eg [1, 2] !== [1, 2]
because there are two separate arrays there, each with a different place in memory. As a result, your .includes
test won't work)
Upvotes: 2