1
votes

Transformer une chaîne de paires de coordonnées en un tableau d'objets

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 ?


1 commentaires

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 lat pour les valeurs lng liées?


5 Réponses :


2
votes

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


2 commentaires

wow, ça a l'air bien plus lisible merci ma concoction, merci beaucoup!


Heureux d'aider!! :-)



1
votes
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);

0 commentaires

0
votes

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


0 commentaires

0
votes

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


0 commentaires

0
votes

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


0 commentaires