gpt4 book ai didi

javascript - 映射和过滤数组,但每 N 个元素添加修改

转载 作者:行者123 更新时间:2023-12-03 04:44:21 25 4
gpt4 key购买 nike

场景:

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

我有这种方法

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 = ", ";
}

但不完全是我正在寻找的......所以......这是我的

<小时/>

问题:

所以...有一种方法可以插入 </br>每个 N 个元素?就我而言,大约 5 个组合 Array.prototype内置函数?

最佳答案

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com