You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何自动将图片文件路径存入数组/对象?JavaScript开发疑问

嘿,我来帮你把这些问题掰扯清楚~

先搞懂你那段fs代码到底啥意思

你贴的这段代码是Node.js环境下用的,先拆解每部分:

  • const fs = require('fs');:这是引入Node.js自带的文件系统模块,只有在Node环境里才能用,浏览器端是没有这个模块的哦。它的作用就是让你能操作本地的文件和文件夹。
  • fs.readdirSync("pics")readdirSync是个同步读取目录的函数,意思是它会卡住后续代码,直到把pics文件夹里的所有文件/子目录都读完,然后返回一个包含文件名的数组。Sync后缀就是“同步”的意思。
  • .forEach(file => { console.log(file); }):遍历刚才读到的每个文件名,把它们打印出来。

为啥代码跑不起来?大概率是这几个原因:

  • 你在浏览器里跑的:这段代码只能在Node.js环境下运行,比如用node 你的文件名.js命令执行。
  • pics文件夹不存在:得确保你的项目根目录下真有个叫pics的文件夹,里面放着扑克牌的jpg。
  • 路径写错了:如果pics不在当前命令执行的目录里,得写完整的相对路径(比如./src/pics)或者绝对路径。
同步还是异步?选哪个合适?

先给你直白说:你的场景用同步完全够用

  • 同步函数(带Sync后缀的):逻辑简单,代码按顺序走,读完目录再干别的。扑克牌最多54张,完全不会有性能问题,不用怕阻塞。
  • 异步函数(不带Sync的,比如fs.readdir):不会卡住代码,读目录的同时可以做别的,但需要处理回调、Promise或者async/await,逻辑更绕。对你来说完全没必要搞这么复杂。
实现需求:把扑克牌路径存数组/对象

下面给你写实用的代码,都是基于Node.js环境的:

存到数组里(最常用,方便后续给img标签用)

const fs = require('fs');
const path = require('path'); // 用这个模块处理路径更靠谱,避免跨系统路径问题

// 先定义图片文件夹的路径,根据你的实际位置调整
const cardPicsDir = './pics';

// 读取文件夹,过滤出jpg文件,再拼接成完整路径
const cardImgPaths = fs.readdirSync(cardPicsDir)
  // 过滤掉非jpg的文件(比如文件夹、其他格式的文件),还兼容大写的.JPG
  .filter(fileName => fileName.toLowerCase().endsWith('.jpg'))
  // 把文件名和文件夹路径拼接成完整的相对路径,比如'pics/红桃A.jpg'
  .map(fileName => path.join(cardPicsDir, fileName));

console.log(cardImgPaths);
// 输出大概是这样:['pics/红桃A.jpg', 'pics/黑桃K.jpg', ...]

存到对象里(如果需要分类管理,比如按花色分)

假设你的图片文件名是红桃A.jpg黑桃2.jpg这种格式,可以按花色分类存到对象里:

const fs = require('fs');
const path = require('path');

const cardPicsDir = './pics';
const cardImgObj = {};

fs.readdirSync(cardPicsDir)
  .filter(fileName => fileName.toLowerCase().endsWith('.jpg'))
  .forEach(fileName => {
    // 拆分文件名:比如'红桃A.jpg'拆成['红桃A', 'jpg'],再取前面的'红桃A'拆成花色和牌面
    const [cardInfo] = fileName.split('.');
    const [suit, rank] = cardInfo.split(''); // 这里根据你实际的文件名格式调整拆分逻辑

    // 如果对象里还没有这个花色的数组,先创建一个
    if (!cardImgObj[suit]) {
      cardImgObj[suit] = [];
    }
    // 把完整路径加进对应花色的数组里
    cardImgObj[suit].push(path.join(cardPicsDir, fileName));
  });

console.log(cardImgObj);
// 输出大概是这样:{ 红桃: ['pics/红桃A.jpg', ...], 黑桃: ['pics/黑桃K.jpg', ...] }
额外提醒(如果是前端项目)

如果你是要在浏览器里给img标签赋值src,那不能直接在前端代码里用fs模块(浏览器不让读本地文件),可以这么做:

  1. 用上面的Node代码生成一个包含路径数组的JSON文件(比如cardPaths.json)。
  2. 前端通过fetch('/cardPaths.json')请求这个文件,拿到路径数组后再生成img标签。
  3. 或者如果图片数量少,直接手动写个路径数组也行~

内容的提问来源于stack exchange,提问作者Adomas Gaudiesius

火山引擎 最新活动