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

时间:2018-12-01 04:10:59

标签: javascript arrays filter

我有一个这样存储的经度和纬度的对象数组,以及一个包含纬度和经度的数组的过滤器数组。我想根据纬度和经度过滤数据。

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))

3 个答案:

答案 0 :(得分:4)

您可以使用Array.filterArray.someArray.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数组中具有所有匹配的元素。

答案 1 :(得分:1)

您可能不是filter,而是.map的{​​{1}},而nearest_array关联的.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]测试无法正常工作

答案 2 :(得分:1)

您可以使用函数filter并使用函数latitude检查longitudesome,这是为了检查至少一个包含这些坐标的对象。 / p>

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; }