Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Reorder array based on condition lodash

I have a collection like so:

var scores = [{
    name: foo,
    score: 34
}, {
    name: bar,
    score: 23
}, {
    name: baz,
    score: 99
}]

I also have a variable containing a name:

var selfName = 'bar';

How can I rearrange scores collection such that the object containing selfName is at index 0. Expected result :

[{
    name: bar,
    score: 23
}, {
    name: foo,
    score: 34
}, {
    name: baz,
    score: 99
}]

I know I can do it by:

var isSelfName = (selfName, score) => {
        var _name = selfName; 
        return (score) => {
        return score.name === selfName;    
    }
};
var result = _.filter(scores, isSelfName(selfName));
result.push(_.reject(scores, isSelfName(selfName)));
result = _.flatten(result);
console.log('result:', result);

Is there a better way of doing it?

like image 916
jgr0 Avatar asked Jun 18 '26 02:06

jgr0


2 Answers

You could sort it with Array#sort and a comparison result as order value.

var scores = [{ name: 'foo', score: 34 }, { name: 'bar', score: 23 }, { name: 'baz', score: 99 }],
    selfName = 'bar';

scores.sort(function (a, b) {
    return (a.name !== selfName) - (b.name !== selfName);
});

console.log(scores);
like image 162
Nina Scholz Avatar answered Jun 19 '26 15:06

Nina Scholz


Excellent solution provided by Nina. But since you want to use lodash there is another alternative solution if you like to consider.

var scores = [{ name: 'foo', score: 34 }, { name: 'bar', score: 23 }, { name: 'baz', score: 99 }],
    selfName = 'bar';

var temp = _.partition(scores, function(score) { return score.name === selfName; });

var result = _.concat(...temp);
console.log(result);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.16.4/lodash.min.js"></script>
like image 41
WitVault Avatar answered Jun 19 '26 14:06

WitVault



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!