2016-10-13 2 views
1

У меня есть коллекция как так:Упорядочивание массива на основе состояния lodash

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

У меня также есть переменная, содержащая имя:

var selfName = 'bar'; 

Как я могу изменить коллекцию забивает таким образом, что объект, содержащий selfName имеет индекс 0. Ожидаемый результат:

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

Я знаю, что могу сделать это:

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

Есть ли лучший способ сделать это?

ответ

2

Вы можете сортировать его с помощью Array#sort и сравнить его с результатами заказа.

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

2

Отличное решение обеспечивает Нина. Но поскольку вы хотите использовать lodash, есть еще одно альтернативное решение, если вы хотите рассмотреть.

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>

+0

И добавить ES6 оператор спреда, чтобы сделать его более лаконичен: результата вара = _.concat (... темп); – jgr0

+0

@ jgr0 спасибо, что указал. Обновлено. – WitVault

0

Другой .sort, который работает. Я думаю, что логическое выражение немного более естественно интуитивно, чем выражение, используемое в типе Нины.

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

 
var selfName = 'bar'; 
 

 
scores.sort(({name:a}, {name:b}) => a === selfName || b === selfName); 
 

 
console.log(scores);

Смежные вопросы