[英]Filter array of objects based on another array of arrays
我有一个像这样存储的经度和纬度的对象数组,以及一个包含纬度和经度的数组的过滤器数组。 我想根据纬度和经度过滤数据。
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]]
结果数组应为-
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}]
我尝试了一些尝试,但似乎无济于事-
data.filter(x => x.LatLng.some(g => nearest_array.includes(g)))
data.filter(x => nearest_array.includes(x.LatLng))
您可以使用Array.filter
, Array.some
和Array.every
做到这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)
这个想法是先过滤主数组及其内部的过滤器,以确保至少有一个filters
所有元素在LatLng
数组中都匹配。
而不是filter
,您可以从nearest_array
.map
,然后.find
关联的LatLng
项-如果输入数组和输出数组是一对一的, .map
会更合适:
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);
(非原始对象,例如对象,数组和函数,彼此不相等,除非它们引用内存中的相同项目-例如[1, 2] !== [1, 2]
因为那里有两个单独的数组 ,每个文件在内存中的位置都不同。因此,您的.includes
测试无法正常进行)
您可以使用该功能filter
并检查latitude
和longitude
使用功能some
,这是用于检查包含这些坐标至少一个对象。
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; }
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.