我不擅长编写复杂的组函数。所以我希望任何人都可以在这里帮助我。我一直在寻找解决方案,但没有找到可以解决我的问题的方法。
我想要的是将数组列表传递给“分组函数”(见下文),该函数按“长度属性”(见数组中的对象)的最大范围将项目分组到下一个数组项目。
我希望我能解释一下我想要实现的目标。
// input
let list = [
{start: 5, length: 1},
{start: 8, length: 1},
{start: 9, length: 1},
{start: 10, length: 1},
{start: 11, length: 1},
{start: 12, length: 1},
{start: 20, length: 1},
{start: 24, length: 1},
{start: 25, length: 1},
{start: 37, length: 2},
{start: 39, length: 1},
{start: 40, length: 1},
];
// group function like
groupedList = groupBy(list, (prevItem, nextItem) => {
return (nextItem.start - prevItem.start) === prevItem.length;
});
// output
let groupedList = [
[
{start: 5, length:1},
],
[
{start: 8, length:1},
{start: 9, length:1},
{start: 10, length:1},
{start: 11, length:1},
{start: 12, length:1},
],
[
{start: 20, length:1},
],
[
{start: 24, length:1},
{start: 25, length:1},
],
[
{start: 37, length:2},
{start: 39, length:1},
{start: 40, length:1},
],
];
最佳答案
您可以检查前导并将其分组到实际 start
等于前导 start
和 length
的总和。
var list = [{ start: 5, length: 1 }, { start: 8, length: 1 }, { start: 9, length: 1 }, { start: 10, length: 1 }, { start: 11, length: 1 }, { start: 12, length: 1 }, { start: 20, length: 1 }, { start: 24, length: 1 }, { start: 25, length: 1 }, { start: 37, length: 2 }, { start: 39, length: 1 }, { start: 40, length: 1 }],
result = list.reduce(function (r, a, i, aa) {
if (!i || aa[i - 1].start + aa[i - 1].length !== a.start) {
r.push([a]);
} else {
r[r.length - 1].push(a);
}
return r;
}, []);
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
关于javascript - 将范围为 {n} (length prop) 的数组中的值分组到下一项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47206866/