场景:

我有一个需要过滤和格式化的对象的可观察数组。

我有这种方法

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>(为简洁起见,下面的示例使用简单的数字代替您拥有的类型,但是可以使用使用原始的greaterThanZeroformatNumberSelected来确定您的类型):



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/

10-09 23:54