Фильтровать массив объектов на основе другого массива массивов

1

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

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

Массив результатов должен быть 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}]

Я пробовал что-то, но ничего не кажется work--

data.filter(x => x.LatLng.some(g => nearest_array.includes(g)))

data.filter(x => nearest_array.includes(x.LatLng))
  • 0
    Нужен ли выходной массив в обратном порядке с nearest_array ?
Теги:
arrays
filter

3 ответа

1
Лучший ответ

Вы можете использовать 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; }
4

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

1

Вместо filter вы можете .map from your 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 тест не будет работать)

  • 0
    Большое спасибо за объяснение. Я действительно не мог понять, почему это не работает, даже когда я пытался приравнять необработанные ценности. Ваше решение сработало

Ещё вопросы

Сообщество Overcoder
Наверх
Меню