首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何对对象数组中的文件进行分组,取决于每个对象的页数

如何对对象数组中的文件进行分组,取决于每个对象的页数
EN

Stack Overflow用户
提问于 2022-08-10 08:02:53
回答 2查看 51关注 0票数 0

我有一组物体:

输入

代码语言:javascript
运行
复制
[
  { 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']
]

我想根据每个页面的页数(如这个输出)将它们分组

代码语言:javascript
运行
复制
{
  "1.pdf": ["1.pdf", "2.pdf"],
  "2.pdf": ["3.pdf", "4.pdf", "5.pdf"],
  "3.pdf": ["6.pdf", "7.pdf", "8.pdf", "9.pdf"],
};

我的尝试:

代码语言:javascript
运行
复制
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);

如果存在唯一的页面数,,但是当其他页面上有相同数量的页面时,它会失败,并将它们组合为一个,而不是创建新页面:

代码语言:javascript
运行
复制
[
  { 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' },
]

输出

代码语言:javascript
运行
复制
{
  "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"],
};

预期产出

代码语言:javascript
运行
复制
{
  "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"],
};
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-08-10 08:21:31

代码

代码语言:javascript
运行
复制
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);

输出

代码语言:javascript
运行
复制
{
  "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"
  ]
}
票数 1
EN

Stack Overflow用户

发布于 2022-08-10 08:25:40

下面是一种使用reduce迭代对象数组的解决方案,每当我们遇到Page: 1或数组末尾时,都会向输出写入一个新值:

代码语言:javascript
运行
复制
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)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73302774

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档