I am trying to order an array of objects with the lodash orderBy function. When the iteratees contains a dot in the middle, the orderBy does not work any more.
Here is a plunker to explain the problem better. plunker
JavaScript
x
9
1
ar users = [
2
{ 'user': 'fred', 'age': 48 },
3
{ 'user': 'barney', 'age': 34 },
4
{ 'user': 'fred', 'age': 40 },
5
{ 'user': 'barney', 'age': 36 }
6
];
7
8
_.orderBy(users, ['user', 'age'], ['asc', 'desc']);
9
Any help will be appreciated.
Thank you in advance.
Advertisement
Answer
You could create a function for the access to exotic key names.
JavaScript
1
6
1
const
2
getPDot = o => o.value['p.'].val,
3
data = [{ id: 'b', value: { 'p.': { val: 2 } } }, { id: 'a', value: { 'p.': { val: 1 } } }, { id: 'c', value: { 'p.': { val: 3 } } }];
4
5
6
console.log(_.orderBy(data, [getPDot], ['asc']));
JavaScript
1
1
1
.as-console-wrapper { max-height: 100% !important; top: 0; }
JavaScript
1
1
1
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.21/lodash.min.js"></script>
A dynamic approach with a closure over key
.
JavaScript
1
6
1
const
2
getValue = key => o => o.value[key].val,
3
data = [{ id: 'b', value: { 'p.': { val: 2 } } }, { id: 'a', value: { 'p.': { val: 1 } } }, { id: 'c', value: { 'p.': { val: 3 } } }];
4
5
6
console.log(_.orderBy(data, [getValue('p.')], ['asc']));
JavaScript
1
1
1
.as-console-wrapper { max-height: 100% !important; top: 0; }
JavaScript
1
1
1
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.21/lodash.min.js"></script>
ES5
JavaScript
1
10
10
1
const
2
getValue = function (key) {
3
return function (o) {
4
return o.value[key].val;
5
};
6
}
7
data = [{ id: 'b', value: { 'p.': { val: 2 } } }, { id: 'a', value: { 'p.': { val: 1 } } }, { id: 'c', value: { 'p.': { val: 3 } } }];
8
9
10
console.log(_.orderBy(data, [getValue('p.')], ['asc']));
JavaScript
1
1
1
.as-console-wrapper { max-height: 100% !important; top: 0; }
JavaScript
1
1
1
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.21/lodash.min.js"></script>