С ES6 вы можете добиться этого, используя уменьшить и синтаксис распространения :
const data = [ { "_id": "aze54aze", "boosted": false }, { "_id": "94v2d9e3", "boosted": false }, { "_id": "999f5a8az4", "boosted": false }, { "_id": "e9d29a9g", "boosted": true }, { "_id": "f8f2a9f6a", "boosted": false }, { "_id": "pe55z8a", "boosted": false }, { "_id": "pvazpd97", "boosted": false }, { "_id": "ft8azefze", "boosted": true }, ]
const shuffleMeSoftly = (d, size) => {
let g = d.reduce((r,c) => (r[c.boosted] = [...r[c.boosted] || [], c],r), {})
return g.false.reduce((r,c,i) => {
let nt = g.true[Math.floor(i/size)]
r = i%size == 0 ? [...r || [], ...(nt ? [nt] : []), c] : [...r || [], c]
return r
}, [])
}
console.log(shuffleMeSoftly(data, 2)) // true every 2 false
console.log(shuffleMeSoftly(data, 3)) // true every 3 false
С lodash и ES6 синтаксис распространения вы можете:
const data = [ { "_id": "aze54aze", "boosted": false }, { "_id": "94v2d9e3", "boosted": false }, { "_id": "999f5a8az4", "boosted": false }, { "_id": "e9d29a9g", "boosted": true }, { "_id": "f8f2a9f6a", "boosted": false }, { "_id": "pe55z8a", "boosted": false }, { "_id": "pvazpd97", "boosted": false }, { "_id": "ft8azefze", "boosted": true }, ]
const shuffleMeSoftly = (d, size) => {
let grouped = _.groupBy(d, 'boosted')
let chunks = _.chunk(grouped.false, size)
return _.reduce(chunks, (r,c,i) => [...r, ...(grouped.true[i] ? [grouped.true[i]] : []), ...c], [])
}
console.log(shuffleMeSoftly(data, 2)) // true every 2 false
console.log(shuffleMeSoftly(data, 3)) // true every 3 false
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script>
Используя groupBy / chunk и затем уменьшите .
Это действительно две строки, если вы добавляете chunks
к редуктору вместо того, чтобы быть его собственной переменной, но я оставил его для удобства чтения и т. Д.