Я использую Листовка и пытаюсь создать полилинию и маркерные точки, но это дает противоположные широту и долготу, поэтому мне приходится их менять местами. Создать маркер легко, потому что он имеет только одну пару широты и длины, но создать полилинию сложно, потому что у нее много точек.
Ниже показано, что я сейчас использую для замены широты и долготы маркерными точками.
var splitObj = objVal.toString().split("],[");
var latlng = splitObj.map(function(x)
{
var couple= (/\d+.\d+, \d+.\d+/g).exec(x).toString();
var splitted = couple.split(", ");
return "["+splitted[1]+","+splitted[0]+"]";
});
latlng.join();
Результат:
['[[a, b], [c, d], [e, f]]'] // this is the objVal
expectation:
['[[b,a], [d,c], [f,e]]']
reality:
['[b,a]']
map
над массивом и для каждого внутреннего массива возвращать новый массив после замены элементов местами.
const data = [[124.432841, 8.3963], [124.496898, 8.3963], [124.571937, 8.40898]];
const result = data.map(arr => {
return [arr[1], arr[0]];
});
console.info(result);
Если подумать, я думаю, что в вопросе ОП массив data
выглядит так: const data = ['[124.432841, 8.3963], [124.496898, 8.3963], [124.571937, 8.40898]']
. Весь внутренний массив находится в кавычках. Итак, он отображается как строка, а не массив.
результаты [Array(2)] 0: Array(2) 0: "[" 1: "[" длина: 2
Чтобы использовать это решение/метод, вам нужно передать ему вложенный массив значений широты и долготы. Например: [[124.432841, 8.3963], [124.496898, 8.3963], [124.571937, 8.40898]]
<-- это вложенный массив, где внутренний массив представляет собой значения lat-long. Какой именно ваш вклад - он такой, как тот, что выше, или он такой: ['[[124.432841, 8.3963], [124.496898, 8.3963], [124.571937, 8.40898]]']
. Это массив всего из одного элемента, и этот элемент — string
.
@JaneDoe а) почему данные широты/долготы вашего буклета представлены массивом строк, и б) почему вы хотите преобразовать массив широты/долготы обратно в строки?
@Энди, я думал, что это лучший способ разделить их, лол
Это настоящий массив, это JSON? @Джейн Доу. Если это JSON, как вы его разбираете? Ваше обновление теперь не имеет смысла, потому что a
и b
относятся к переменным, а не к реальным числам.
Предполагая, что ввод представляет собой строку значений, подобных вложенному массиву, приведенное ниже решение может помочь в преобразовании/замене значений широты и долготы.
Фрагмент кода
const inpVal = ['[[a, b], [c, d], [e, f]]'];
// helper method to strip first & last char of a string
const stripFirstLast = s => s.slice(1, s.length - 1);
// helper method to swap lat & longitutde values
const swapLatLon = ([lat, lon]) => [lon, lat];
// place holder to safe-keep value of input
const tmp = stripFirstLast(inpVal[0])
.replaceAll('], ', '] | ')
.split(' | ');
// calculate the result
const res = ["[" +
tmp.map(
x => '[' +
swapLatLon(
stripFirstLast(x).split(', ')
).join(', ') +
']'
).join(', ') +
"]"
];
// console-log to validate/verify
console.info(
'input: ', inpVal,
'\nresult: ', res
);
Объяснение
Встроенные комментарии объясняют используемый подход.
Замена фактическими значениями (а не строкой)
This is an almost-exact replica of Andy's solution/answer with only one change instead of handling the inner array as
arr
, the iterator directly accesses the lat & lon values. I think it makes the solution a little more easier to read.
// Previous solution where the orig data was not taken as a string
const swapLoLa = arr => arr.map(([lon, lat]) => [lat, lon]);
const orig = [[124.432841, 8.3963], [124.496898, 8.3963], [124.571937, 8.40898]];
console.info(
'orig arr: ', orig,
'\nswapped arr: ', swapLoLa(orig)
);
Еще проще вот так:
const result = data.map(([la, lo]) => ([lo, la]));
.