繁体   English   中英

根据另一个数组数组过滤对象数组

[英]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.filterArray.someArray.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并检查latitudelongitude使用功能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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM