场景:
我有一个需要过滤和格式化的对象的可观察数组。
我有这种方法
messageModel.solution(self.selectedNumbers()
.filter(greaterThanZero)
.map(formatNumberSelected)
.join(', ');
通过这两个功能:
function greaterThanZero(number) { return number.amount() > 0 };
function formatNumberSelected(number){ return number.theNumber + " [" + number.amount() + "]" };
这以字符串形式给出了出色的结果,
12346 [3], 12347 [3], 12348 [3], 12349 [3], 12350 [2], 12351 [3], 12352 [3], 12353 [6], 12354 [2], 12355 [3], 12356 [2], 12357 [3], 12358 [3], 12359 [6], 12360 [3], 12361 [3], 12362 [6], 12363 [3], 12364 [6], 12365 [3], 12366 [3], 12367 [6], 12368 [3], 12369 [2], 12370 [3], 12371 [2], 12372 [6], 12373 [3], 12374 [6], 12375 [2], 12376 [3], 12377 [2], 12378 [3], 12379 [2], 12380 [6], 12381 [2], 12382 [3], 12383 [2], 12384 [6]
但是,只要这能形成模式的HTML,就不是很可读。
预期结果:(为理解和可读性模拟了新的一行!)
12346 [3], 12347 [3], 12348 [3], 12349 [3], 12350 [2]<br>,
12351 [3], 12352 [3], 12353 [6], 12354 [2], 12355 [3]<br>,
12356 [2], 12357 [3], 12358 [3], 12359 [6], 12360 [3]<br>,
12361 [3], 12362 [6], 12363 [3], 12364 [6], 12365 [3]<br>,
12366 [3], 12367 [6], 12368 [3], 12369 [2], 12370 [3]<br>,
12371 [2], 12372 [6], 12373 [3], 12374 [6], 12375 [2]<br>,
12376 [3], 12377 [2], 12378 [3], 12379 [2], 12380 [6]<br>,
12381 [2], 12382 [3], 12383 [2], 12384 [6]
实际方法:
我当然可以通过以下方式实现此结果:
var candidates = self.selectedNumbers().filter(greaterThanZero);
var SEPARATOR = "";
var toReturn = "";
for (var item in candidates) {
var number = candidates[item];
toReturn = toReturn + SEPARATOR + number.theNumber + " [" + number.amount() + "]";
if (item % 5 === 0) toReturn = toReturn + "</br>";
SEPARATOR = ", ";
}
但是不完全是我想要的...所以..这是我的
题:
那么...有一种方法可以每N个元素插入一个
</br>
吗?就我而言,结合内置函数Array.prototype
大约是5个吗? 最佳答案
Array#map
传递一个可选的索引参数,因此您可以使用它:
function formatNumberSelected(number, i){
return number.theNumber +
" [" + number.amount() + "]" +
(i % 5 === 4 ? '<br>' : '');
}
或将其分成两个
.map()
,以使单个函数的作用不大:messageModel.solution(self.selectedNumbers()
.filter(greaterThanZero)
.map(formatNumberSelected)
.map(insertBreak)
.join(', ');
function insertBreak(val, i) {
return val + (i % 5 === 4 ? '<br>' : '');
}
或者,如果您可以访问lodash之类的库,则可以对数字进行分块,然后添加分隔符和
<br>
(为简洁起见,下面的示例使用简单的数字代替您拥有的类型,但是可以使用使用原始的greaterThanZero
和formatNumberSelected
来确定您的类型):var formatted = _.chain(selectedNumbers())
.filter(greaterThanZero)
.map(formatNumberSelected)
.chunk(5)
.map(addSeparators)
.join(', <br>');
console.log(formatted);
function greaterThanZero(number) { return number > 0 }
function formatNumberSelected(number){
return "[" + number + "]";
}
function addSeparators(rowValues) {
return rowValues.join(', ');
}
function selectedNumbers() {
return [5, 6, 7, 0, 9, 3, 2, 6, 7, 0, 1, 9, 2, 9];
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>
关于javascript - 映射和过滤器数组,但每N个元素添加修改,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42933353/