chip chip - 3 years ago 79
Javascript Question

Natural sorting object of indexed arrays

I have this structure, which I have no control over, and need to do a sort by the clients.
The index of the various arrays relate to each other, i.e. client[0] relates to suites[0].
Can this structure be sorted in this way ?

Current structure :

'client' : [ Bravo,Alpha, 1 Delta, 2 Charlie],
'locations' : [ 2,1,3,4 ],
'suites' : [ B,A,C,D ],
'ids' : [ 16,18,25,65 ]


Expected output:

'client' : [ 1 Delta, 2 Charlie, Alpha,Bravo ],
'locations' : [ 3,4,1,2 ],
'suites' : [ C,D,A,B ],
'ids' : [ 25,65,18,16 ]

Answer Source

You could use sorting with map and String#localeCompare with options

sensitivity

Which differences in the strings should lead to non-zero result values. Possible values are:

  • "base": Only strings that differ in base letters compare as unequal. Examples: a ≠ b, a = á, a = A.
  • "accent": Only strings that differ in base letters or accents and other diacritic marks compare as unequal. Examples: a ≠ b, a ≠ á, a = A.
  • "case": Only strings that differ in base letters or case compare as unequal. Examples: a ≠ b, a = á, a ≠ A.
  • "variant": Strings that differ in base letters, accents and other diacritic marks, or case compare as unequal. Other differences may also be taken into consideration. Examples: a ≠ b, a ≠ á, a ≠ A.

The default is "variant" for usage "sort"; it's locale dependent for usage "search".

numeric

Whether numeric collation should be used, such that "1" < "2" < "10". Possible values are true and false; the default is false. This option can be set through an options property or through a Unicode extension key; if both are provided, the options property takes precedence. Implementations are not required to support this property.

var object = { client: ['Bravo', 'Alpha', '1 Delta', '2 Charlie'], locations: [2, 1, 3, 4], suites: ['B', 'A', 'C', 'D'], ids: [16, 18, 25, 65] },
    indices = object.client.map((_, i) => i);

indices.sort((a, b) => object.client[a].localeCompare(object.client[b], undefined, { numeric: true, sensitivity: 'base' }));

Object.keys(object).forEach(function (key) {
    object[key] = indices.map(i => object[key][i]);
});

console.log(object);
.as-console-wrapper { max-height: 100% !important; top: 0; }

Recommended from our users: Dynamic Network Monitoring from WhatsUp Gold from IPSwitch. Free Download