Je reçois les coordonnées d'une base de données sous forme de chaîne, mais je dois les transformer en un tableau d'objets afin de les utiliser ultérieurement avec Google Maps.
J'ai réussi à diviser et découper le tableau par paires, mais J'ai des problèmes pour transformer les blocs en paires clé-valeur.
let coordinatesString = "-80.486470, 43.390095, -80.486854, 43.390228, -80.486796, 43.389998, -80.486292, 43.389968, -80.486282, 43.390030"
// split the string by , in order to get an array
let splitArray = coordinatesString.split(', ')
function chunk(arr, chunkSize) {
var result = [];
for (var i=0,len=arr.length; i<len; i+=chunkSize)
result.push(arr.slice(i,i+chunkSize));
return result;
}
// chunk an array into couples of 2
let chunkedArray = [chunk(splitArray, 2)]
console.log (chunkedArray)
// ["-80.486470", "43.390095"], ["-80.486854", "43.390228"],
// ["-80.486796", "43.389998"], ["-80.486292", "43.389968"],
// ["-80.486282", "43.390030"]
// transform chunked array into an object
var objs = chunkedArray.map(function (arr) {
return arr.reduce(function (res, curr) {
var [key, value] = curr;
res[key] = value;
return res;
}, {});
});
console.log(objs);
// Current output
//[{
// -80.486282: "43.390030",
// -80.486292: "43.389968",
// -80.486470: "43.390095",
// -80.486796: "43.389998",
// -80.486854: "43.390228"
// }]
// Desired output
// [{ "lng": -80.486282, "lat": 43.390030 },
// { "lng": -80.486292, "lat": 43.389968 },
// { "lng": -80.486470, "lat": 43.390095 },
// { "lng": -80.486796, "lat": 43.389998 },
// { "lng": -80.486854, "lat": 43.390228 }]
Quelle serait la meilleure façon de transformer un tableau fragmenté en un objet lng / lat ?
5 Réponses :
Essayez la fonction ci-dessous.
function getCoordinates(str) {
const arr = str.split(', ');
const finalArr = [];
for (var i = 0, n = arr.length; i < n; i+=2) {
finalArr.push({
"lng": parseFloat(arr[i]),
"lat": parseFloat(arr[i+1])
});
}
return finalArr;
}
let coordinatesString = "-80.486470, 43.390095, -80.486854, 43.390228, -80.486796, 43.389998, -80.486292, 43.389968, -80.486282, 43.390030";
console.log(getCoordinates(coordinatesString));
wow, ça a l'air bien plus lisible merci ma concoction, merci beaucoup!
Heureux d'aider!! :-)
let coordinatesString = "-80.486470, 43.390095, -80.486854, 43.390228,
-80.486796, 43.389998, -80.486292, 43.389968, -80.486282, 43.390030"
let splitArray = coordinatesString.split(', ')
let objs = [];
for(let i = 0; i < splitArray.length-1; i+=2) {
objs.push({'lng':splitArray[i], 'lat':splitArray[i+1]});
}
console.log(objs);
C'est un cas où une boucle à l'ancienne for est plus utile que map et reduction . (Également plus performant, probablement.)
[
{ lng: -80.48647, lat: 43.390095 },
{ lng: -80.486854, lat: 43.390228 },
{ lng: -80.486796, lat: 43.389998 },
{ lng: -80.486292, lat: 43.389968 },
{ lng: -80.486282, lat: 43.39003 }
]
coordinObjects finit par être
let coordinatesString = "-80.486470, 43.390095, -80.486854, 43.390228, -80.486796, 43.389998, -80.486292, 43.389968, -80.486282, 43.390030";
const coordinateObjects = [];
const splitCoordinates = coordinatesString.split(", ");
for(let i = 0; i < splitCoordinates.length; i += 2) {
coordinateObjects.push({lng: parseFloat(splitCoordinates[i]), lat: parseFloat(splitCoordinates[i + 1])});
}
En supposant que les données soient bien formatées, vous pouvez utiliser l'expression régulière /(.+?),\s*(.+?)(?:,\s*|$)/ pour localisez toutes les paires, puis analysez chaque coordonnée en nombre et créez des objets avec les propriétés lat / lng . Enfin, appliquez un tri sur lng (si vous le souhaitez).
Si vous souhaitez effectuer un sous-tri basé sur lat pour les paires avec lng correspondant, vous pouvez ajouter un epsilon pour les mathématiques en virgule flottante et ajouter des branches supplémentaires à
code> sort le rappel de .
const coordinates = "-80.486470, 43.390095, -80.486854, 43.390228, -80.486796, 43.389998, -80.486292, 43.389968, -80.486282, 43.390030";
const res = [...coordinates.matchAll(/(.+?),\s*(.+?)(?:,\s*|$)/g)]
.map(e => ({lng: +e[1], lat: +e[2]}))
.sort((a, b) => b.lng - a.lng)
;
console.log(res);
Voici une option qui utilise la réduction. Le rappel de réduction a l'index actuel et le tableau d'origine comme troisième et quatrième paramètres. La boucle for de base est probablement plus performante que cela.
[
{ lng: -80.48647, lat: 43.390095 },
{ lng: -80.486854, lat: 43.390228 },
{ lng: -80.486796, lat: 43.389998 },
{ lng: -80.486292, lat: 43.389968 },
{ lng: -80.486282, lat: 43.39003 }
]
Le résultat doit être.
const coordinatesString = "-80.486470, 43.390095, -80.486854, 43.390228, -80.486796, 43.389998, -80.486292, 43.389968, -80.486282, 43.390030";
const coordinates = coordinatesString
.split(', ')
.reduce((acc, curr, idx, arr) => {
if (idx % 2 === 0) {
acc.push({
lng: Number(curr),
lat: Number(arr[idx + 1])
})
}
return acc;
}, []);
console.log(coordinates);
Bienvenue à SO! Il semble que la sortie souhaitée est triée. Est-ce une exigence? Si tel est le cas, devez-vous effectuer un sous-tri sur
latpour les valeurslngliées?