我有一组物体:
输入
[
{ file: '1.pdf', text: 'Page: 1 / 2' },
{ file: '2.pdf', text: 'Page: 2 / 2' },
// -- '1.pdf':['1.pdf','2.pdf']
{ file: '3.pdf', text: 'Page: 1 / 3' },
{ file: '4.pdf', text: 'Page: 2 / 3' },
{ file: '5.pdf', text: 'Page: 3 / 3' },
// -- '2.pdf':['3.pdf','4.pdf', '5.pdf']
{ file: '6.pdf', text: 'Page: 1 / 4' },
{ file: '7.pdf', text: 'Page: 2 / 4' },
{ file: '8.pdf', text: 'Page: 3 / 4' },
{ file: '9.pdf', text: 'Page: 4 / 4' }
// -- '3.pdf':['6.pdf','7.pdf', '8.pdf', '9.pdf']
]我想根据每个页面的页数(如这个输出)将它们分组
{
"1.pdf": ["1.pdf", "2.pdf"],
"2.pdf": ["3.pdf", "4.pdf", "5.pdf"],
"3.pdf": ["6.pdf", "7.pdf", "8.pdf", "9.pdf"],
};我的尝试:
let arr = [
{ file: "1.pdf", text: "Page: 1 / 2" },
{ file: "2.pdf", text: "Page: 2 / 2" },
{ file: "3.pdf", text: "Page: 1 / 3" },
{ file: "4.pdf", text: "Page: 2 / 3" },
{ file: "5.pdf", text: "Page: 3 / 3" },
{ file: "6.pdf", text: "Page: 1 / 4" },
{ file: "7.pdf", text: "Page: 2 / 4" },
{ file: "8.pdf", text: "Page: 3 / 4" },
{ file: "9.pdf", text: "Page: 4 / 4" },
];
let result = {};
let i = 0;
let x = null;
let visited = [];
for (const { file, text } of arr) {
let val = text.split("/").at(-1).trim();
let key = null;
if (!visited.includes(val)) {
key = ++i + ".pdf";
x = key;
visited.push(val);
} else {
key = x;
}
result[key] ??= [];
result[key].push(file);
}
console.log(result);
如果存在唯一的页面数,,但是当其他页面上有相同数量的页面时,它会失败,并将它们组合为一个,而不是创建新页面:
[
{ file: '1.pdf', text: 'Page: 1 / 2' },
{ file: '2.pdf', text: 'Page: 2 / 2' },
{ file: '3.pdf', text: 'Page: 1 / 3' },
{ file: '4.pdf', text: 'Page: 2 / 3' },
{ file: '5.pdf', text: 'Page: 3 / 3' },
{ file: '6.pdf', text: 'Page: 1 / 4' },
{ file: '7.pdf', text: 'Page: 2 / 4' },
{ file: '8.pdf', text: 'Page: 3 / 4' },
{ file: '9.pdf', text: 'Page: 4 / 4' },
{ file: '10.pdf', text: 'Page: 1 / 2' },
{ file: '11.pdf', text: 'Page: 2 / 2' },
]输出
{
"1.pdf": ["1.pdf", "2.pdf"],
"2.pdf": ["3.pdf", "4.pdf", "5.pdf"], // vvvvvvvvvvvvvvvvvv
"3.pdf": ["6.pdf", "7.pdf", "8.pdf", "9.pdf", "10.pdf", "11.pdf"],
};预期产出
{
"1.pdf": ["1.pdf", "2.pdf"],
"2.pdf": ["3.pdf", "4.pdf", "5.pdf"],
"3.pdf": ["6.pdf", "7.pdf", "8.pdf", "9.pdf"],
"4.pdf": ["10.pdf", "11.pdf"],
};发布于 2022-08-10 08:21:31
代码
var array = [
{ file: '1.pdf', text: 'Page: 1 / 2' },
{ file: '2.pdf', text: 'Page: 2 / 2' },
{ file: '3.pdf', text: 'Page: 1 / 3' },
{ file: '4.pdf', text: 'Page: 2 / 3' },
{ file: '5.pdf', text: 'Page: 3 / 3' },
{ file: '6.pdf', text: 'Page: 1 / 4' },
{ file: '7.pdf', text: 'Page: 2 / 4' },
{ file: '8.pdf', text: 'Page: 3 / 4' },
{ file: '9.pdf', text: 'Page: 4 / 4' },
{ file: '10.pdf', text: 'Page: 1 / 2' },
{ file: '11.pdf', text: 'Page: 2 / 2' },
];
var ret = {};
var lastGroup = 0;
array.forEach(function (value, i) {
if(value.text.includes("Page: 1 /")){
lastGroup++;
ret[lastGroup + ".pdf"]=[];
}
ret[lastGroup + ".pdf"].push(value.file);
});
console.log(ret);输出
{
"1.pdf": [
"1.pdf",
"2.pdf"
],
"2.pdf": [
"3.pdf",
"4.pdf",
"5.pdf"
],
"3.pdf": [
"6.pdf",
"7.pdf",
"8.pdf",
"9.pdf"
],
"4.pdf": [
"10.pdf",
"11.pdf"
]
}发布于 2022-08-10 08:25:40
下面是一种使用reduce迭代对象数组的解决方案,每当我们遇到Page: 1或数组末尾时,都会向输出写入一个新值:
const arr = [
{ file: '1.pdf', text: 'Page: 1 / 2' },
{ file: '2.pdf', text: 'Page: 2 / 2' },
{ file: '3.pdf', text: 'Page: 1 / 3' },
{ file: '4.pdf', text: 'Page: 2 / 3' },
{ file: '5.pdf', text: 'Page: 3 / 3' },
{ file: '6.pdf', text: 'Page: 1 / 4' },
{ file: '7.pdf', text: 'Page: 2 / 4' },
{ file: '8.pdf', text: 'Page: 3 / 4' },
{ file: '9.pdf', text: 'Page: 4 / 4' },
{ file: '10.pdf', text: 'Page: 1 / 2' },
{ file: '11.pdf', text: 'Page: 2 / 2' },
]
const result = arr.reduce(({ fnum, pages, files }, { file, text }, i, a) => {
const pgnum = text.match(/Page: (\d+)/)[1]
if (i == a.length - 1) {
pages.push(file)
files[`${++fnum}.pdf`] = pages
return files
}
else if (pgnum == 1 && pages.length) {
files[`${++fnum}.pdf`] = pages
pages = [file]
}
else {
pages.push(file)
}
return { fnum, pages, files }
}, { fnum : 0, pages : [], files : {} });
console.log(result)
https://stackoverflow.com/questions/73302774
复制相似问题