2016-10-13 70 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傳播經營者,使之更加簡潔: VAR的結果= _.concat(...溫度); – jgr0

+0

@ jgr0謝謝指出。更新。 – WitVault

0

另一個.sort的作品。我認爲這個邏輯表達式比Nina所使用的表達式更自然一些。

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