SKU 素材目录查漏图,可以从业务提供的预期文件名与实际文件名做集合差异。缺失、多余和预期重复是不同问题,下面用 JavaScript 分别返回。程序不根据图片内容猜 SKU,也不自动删除多余文件;它输出的是核对清单,后续动作仍需要确认。
SKU 素材目录查漏图,可以从业务提供的预期文件名与实际文件名做集合差异。缺失、多余和预期重复是不同问题,下面用 JavaScript 分别返回。程序不根据图片内容猜 SKU,也不自动删除多余文件;它输出的是核对清单,后续动作仍需要确认。
例如蓝色主图与红色主图都在交付单里,目录只有蓝色图和一个旧包装文件。人工看缩略图可能觉得这批已经有图,集合比较则能明确指出红色图缺失、旧文件多余。前提是预期清单正确,如果商品表本身漏了一款,算法无法知道业务没写出来的要求。
让文件名先成为稳定身份
示例只接受单层普通文件名,不允许包含路径分隔符。它不负责遍历目录,实际文件列表由文件系统读取后传入。保留大小写和原始名称,不自动转小写或去掉版本,因为这种规范化可能把两个本应不同的交付项合并;业务若需要另一规则,应先明确并测试。

export function auditAssets(expected, actual) {
for (const name of [...expected,...actual]) {
if (typeof name!=='string' || !name || /[\\/]/.test(name)) throw Error('use flat file names');
}
const wanted=new Set(expected), found=new Set(actual);
const duplicateExpected=expected.filter((x,i) => expected.indexOf(x)!==i);
return {
missing:[...wanted].filter(x=>!found.has(x)).sort(),
extra:[...found].filter(x=>!wanted.has(x)).sort(),
duplicateExpected:[...new Set(duplicateExpected)].sort()
};
}
// auditAssets(['A-blue-main.png','A-red-main.png'], ['A-blue-main.png','old.png']);
保存为 audit-assets.mjs,在同一项目导入 auditAssets。预期可以由商品清单生成,实际可以来自目录读取;两者都使用一致的命名协议。Set 负责判定是否存在,结果排序便于对照。预期重复单独列出,因为重复的交付需求可能意味着输入表出了错,而不只是一个无害的重复字符串。
验证缺失、多余与边界
本次输入预期 a、b、b,实际 a、old,函数返回 missing 为 b、extra 为 old、duplicateExpected 为 b。另传入带 ../ 的文件名,示例拒绝执行。验证运行于 Node.js v24.16.0,说明最小集合核对按预期工作,不意味着所有路径、Unicode名称或操作系统差异都已覆盖。
代码的大小写比较是严格字符串比较,可能与文件系统行为不同。Windows 同目录的命名规则不能直接搬到其他系统;如果要跨环境同步,建议在交付协议中规定字符与大小写,再单独检查规范化冲突。不要让程序悄悄合并冲突文件,然后宣布缺图已经解决。
文件存在不等于图片内容正确。同名文件可能属于旧包装或另一个 SKU,集合核对不会发现;可以再加哈希、图片解码和人工商品事实检查,但这些层次分别记录。缺失清单用于补文件,多余清单用于确认来源,不能将多余文件视为应自动删除的数据。
Picset 或其他制作流程产生的图片,可以通过稳定 SKU、用途与版本命名接入清单,[1] 本文没有声称工具会自动维护这份对应。制作环节与交付检查分开之后,即使换工具,核对协议仍然可用,不需要根据某个软件界面重新设计所有文件身份。
建议先在临时目录运行检查,把结果交给资料负责人确认,再制定复制或发布动作。程序保持只读,第一次接入更容易复查。清单对得上只是交付的一项条件,最终还需确认每张图讲的是正确商品,以及目标版位能清楚呈现它。