Фильтровать массив объектов на основе другого массива массивов - PullRequest
0 голосов
/ 01 декабря 2018

У меня есть массив объектов с широтой и долготой, которые хранятся таким образом, и массив фильтров с широтой и долготой.Я хочу отфильтровать свои данные по широте и долготе.

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 голосов
/ 01 декабря 2018

Вы можете сделать это с помощью Array.filter, Array.some и 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 массив.

0 голосов
/ 01 декабря 2018

Вы можете использовать функцию 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; }
0 голосов
/ 01 декабря 2018

Вместо filter вы можете .map из вашего 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], потому что есть там два отдельных массива , каждый из которых занимает свое место в памяти. В результате ваш тест .includes не будет работать)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...