Je cherche comment trier par place.city ce type d'objet qui a des identifiants pour les clés. Le besoin est de garder les identifiants des premières clés…

{
    "123": {
        "place": {
            "city": "New York",
            "country": "USA" 
        },
        "person": {
            "name": "Bob",
            "age": 45
        }
    },
    "456": {
        "place": {
            "city": "Chicago",
            "country": "USA" 
        },
        "person": {
            "name": "Louis",
            "age": 34
        }
    },
    "789": {
        "place": {
            "city": "Dallas",
            "country": "USA" 
        },
        "person": {
            "name": "Kevin",
            "age": 27
        }
    }
}

J'essaie une sorte de fonction comme celle-ci et le résultat attendu n'est pas là.

let result = _(myObject).map(function (value, key) {
    return _.defaults({ name: key }, value)
}).sortBy('city').value()
1
imanu 17 avril 2018 à 09:49

5 réponses

Meilleure réponse

Vous ne pouvez pas trier un objet. Cependant, vous pouvez créer un tableau trié contenant des références aux objets:

  const sorted = Object.values(myObject).sort((a, b) => a.place.city.localeCompare(b.place.city));
0
Jonas Wilms 17 avril 2018 à 07:06

Je me rends compte que l'objet que je dois traiter (obtenir à partir d'une API obscure) est un peu plus compliqué que mon premier exemple: /

Donc les réponses que vous donnez gentiment ne fonctionnent plus…

Voyez-vous la subtilité de ce nouvel objet?

Le point reste à trier par place.city

{
    "123": {
      0: {
        "place": {
            "city": "New York",
            "country": "USA" 
        },
        "person": {
            "name": "Bob",
            "age": 45
        }
      },
      1: {
        "place": {
            "city": "New York",
            "country": "USA" 
        },
        "person": {
            "name": "James",
            "age": 32
        }
      }
    },
    "456": {
      0: {
        "place": {
            "city": "Chicago",
            "country": "USA" 
        },
        "person": {
            "name": "Louis",
            "age": 34
        }
      },
      1: {
        "place": {
            "city": "Chicago",
            "country": "USA" 
        },
        "person": {
            "name": "Christine",
            "age": 65
        }
      }
    },
    "789": {
      0: {
        "place": {
            "city": "Dallas",
            "country": "USA" 
        },
        "person": {
            "name": "Kevin",
            "age": 27
        }
      },
      1: {
        "place": {
            "city": "Dallas",
            "country": "USA" 
        },
        "person": {
            "name": "Robert",
            "age": 55
        }
      },
      2: {
        "place": {
            "city": "Dallas",
            "country": "USA" 
        },
        "person": {
            "name": "Danny",
            "age": 62
        }
      }
    }
}
0
imanu 17 avril 2018 à 12:16

Vous ne pouvez pas trier un objet. Vous pouvez cependant convertir votre objet en un tableau et le trier.

var data ={
  "123" : {
    "place": {
      "city": "New York",
      "country": "USA" 
    },
    "person": {
      "name": "Bob",
      "age": 45
    }
  },
  "456" : {
    "place": {
      "city": "Chicago",
      "country": "USA" 
    },
    "person": {
      "name": "Louis",
      "age": 34
    }
  },
  "789" : {
    "place": {
      "city": "Dallas",
      "country": "USA" 
    },
    "person": {
      "name": "Kevin",
      "age": 27
    }
  }
};

var sortedByPlace = _.sortBy(Object.keys(data).map(k => ({id:k, ...data[k]})), (d)=> d.place.city)

console.log(sortedByPlace);
<script src="https://cdn.jsdelivr.net/npm/lodash@4.17.5/lodash.min.js"></script>
1
Chirag Ravindra 17 avril 2018 à 07:05

Il n'est pas possible de trier un objet, vous devez en faire une liste.

import { map, flow } from 'lodash'
import { sortBy } from 'lodash/fp'

cities => flow(
  map(places, (place, id) => { id, ...place }),
  sortBy('city'),
)()

Votre deuxième question pose la question (mh ...) si vous voulez un tri local. Ce serait

import { mapValues } from 'lodash'
import { sortBy } from 'lodash/fp'

data => mapValues(data, sortBy('place.city'))
1
Markus 20 avril 2018 à 12:46

Si vous regardez this réponse, les éléments suivants devraient fonctionner

var sort = function (prop, arr) {
    prop = prop.split('.');
    var len = prop.length;

    arr.sort(function (a, b) {
        var i = 0;
        while( i < len ) { a = a[prop[i]]; b = b[prop[i]]; i++; }
        if (a < b) {
            return -1;
        } else if (a > b) {
            return 1;
        } else {
            return 0;
        }
    });
    return arr;
};
sort("place.city", myObject);
0
Andreas Storvik Strauman 17 avril 2018 à 06:59