css 将对象数组分块并按首字母对块分组

wj8zmpe1  于 2022-11-27  发布在  其他
关注(0)|答案(1)|浏览(124)

假设我有一个数组(已经按Name排序):

let obj = {
CategoryOne:[
{
   name: "An Item"
   color: "Red"
},
{
   name: "Blue Item"
   color: "Blue"
}
],
CategoryTwo: [
...
]
...
}

我想根据第一个字母将每个类别分成三列。目前,我的解决方案是:

function sort(obj) {
            let sorted: any = {};
            for(let key in obj) {
                const category = obj[key]
                let chunks: any = [];
                const chunkSize = Math.ceil(category .length / 3) + 5;
                for (let i = 0; i < category.length; i += chunkSize) {
                    const chunk = category.slice(i, i + (chunkSize)).reduce((r: any, a: any) => {
                        r[a.name[0].toUpperCase()] = [...r[a.name[0]] || [], a];
                        return r;
                    }, {});;
                    chunks.push(chunk);
                }
                // Set {firstCol, secondCol, thirdCol} to sorted[key]
                sorted[key] = {
                    firstCol: chunks[0],
                    secondCol: chunks[1],
                    thirdCol: chunks[2],
                };
            }

            return sorted;
        });

这是可行的。* 但是,* 我无法找到一种方法,在说明标题的同时,根据首字母平均分配。例如,上面将生成以下内容:

我不确定是否需要根据一列中的字母数量来对字母进行不同的加权,是否可以用CSS解决这个问题,或者是否值得努力使各列均匀分布(最后一列可能是最短的)
任何帮助都是非常感谢的!

编辑(基于回答)

CSS可以处理列的均匀分布,但是,我仍然 * 需要 * 标题是每列(见“S”标题在下面的第2列和第3列):

vwkv1x7d

vwkv1x7d1#

对相等的列使用columns1(https://developer.mozilla.org/en-US/docs/Web/CSS/columns) CSS属性。
编辑:要确保标题后不会出现分栏符,请将title元素的break-after css属性设置为avoid2(https://developer.mozilla.org/en-US/docs/Web/CSS/break-after)
第一个
若要获得重复列标题的结果:假设您从具有各种数组的键对象开始:
1.按顺序遍历数据,跟踪当前的行和列索引。
1.使用每个新元素更新行号,并根据最大列高((elements + keys + some tuning) / 3的总数)检查行号
1.传递最大高度时,增加列位置并重置行位置。
1.如果要在列的第一行添加内部元素(currentRow === 0),请先添加列标题
第一个

相关问题