我有一组物体:
输入
[
  { 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
复制相似问题