这可以通过使用Ramda来实现,首先使用
R.splitEvery
然后使用在每个拆分列表之间添加分隔符
R.intersperse
并最终将拆分列表与
R.unnest
.
(注意,为了简洁起见,我用下面的字符串替换了JSX)
// inserts `sep` between every `n` elements of a list `xs`
const separateEvery = (sep, n, xs) =>
R.unnest(R.intersperse([sep], R.splitEvery(n, xs)))
const genElements = (totalSize, progress) =>
separateEvery('Separator', 3, R.concat(
R.repeat('CheckCircle', progress),
R.repeat('CheckBoxOutline', totalSize - progress)
))
console.log(genElements(18, 7))
<script src="//cdnjs.cloudflare.com/ajax/libs/ramda/0.25.0/ramda.min.js"></script>
针对以下评论的更新
向每个生成的元素添加键的一种方法是使用
React.cloneElement
.
const genElementsWithKey = R.pipe(
genElements,
R.addIndex(R.map)((el, key) => React.cloneElement(el, {key}))
)
或者,如果您不想使用
cloneElement
因为某种原因你可以换掉
R、 散布
使用
R.zipWith
创建要在每组元素之间插入的唯一分隔符元素。
const createCircle = _ => '<CheckCircle key={uid()} />'
const createCheckBox = _ => '<CheckBoxOutline key={uid()} />'
const createSeparator = _ => '<Separator key={uid()} />'
const genElements = (totalSize, progress) => {
const splitEls = R.splitEvery(3, R.concat(
R.map(createCircle, R.range(0, progress)),
R.map(createCheckBox, R.range(progress, totalSize))
))
const firstSplitGroup = splitEls[0]
const remainingSplitGroups = R.tail(splitEls)
// create a list of separators matching the number of elements in remainingSplitGroups
const separators = R.map(createSeparator, R.range(0, remainingSplitGroups.length))
return R.concat(
// keep the first split group as is
firstSplitGroup,
// prepend a separator to each of the remaining split groups
R.unnest(R.zipWith(R.prepend, separators, remainingSplitGroups))
)
}
console.log(genElements(18, 7))
<script src=“//cdnjs.cloudflare.com/ajax/libs/ramda/0.25.0/ramda.min.js”></脚本(>);