V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐关注
Meteor
JSLint - a JavaScript code quality tool
jsFiddle
D3.js
WebStorm
推荐书目
JavaScript 权威指南第 5 版
Closure: The Definitive Guide
jamfer
V2EX  ›  JavaScript

请教一个前端 JS 以数组值作为变量名的问题

  •  
  •   jamfer · 2022-03-03 21:05:23 +08:00 · 2250 次点击
    这是一个创建于 783 天前的主题,其中的信息可能已经有所发展或是发生改变。
    现在有一个数组:
    var street_01 = ['scorner_02','sdoor_04','sdoor_03','sdoor_06','sdoor_01','raised_02','sdoor_02','station','sdoor_03','scorner_01'];

    我希望用一个遍历实现每个数组值都作为一个变量名,变量值是数组的键。
    如:
    console.log(scorner_02)结果为 0
    console.log(sdoor_03)结果为 2
    ......


    请问该怎么写遍历?
    enchilada2020
        1
    enchilada2020  
       2022-03-03 21:10:27 +08:00 via Android
    const map = new Map (arr.map((v, i)=> [v, i]));
    map.get(v);
    zcf0508
        2
    zcf0508  
       2022-03-03 21:16:06 +08:00 via Android
    findIndex ?
    jamfer
        3
    jamfer  
    OP
       2022-03-03 21:16:10 +08:00
    @enchilada2020 我并不是想要利用值得到键,我主要是想要用遍历数组批量创建变量。为了好描述一些帖子简化了。
    enchilada2020
        4
    enchilada2020  
       2022-03-03 21:20:57 +08:00 via Android   ❤️ 1
    @jamfer arr.forEach ((v. i) => window[v] = i)
    enchilada2020
        5
    enchilada2020  
       2022-03-03 21:22:39 +08:00 via Android
    @enchilada2020 或者把 window 换成 globalThis 如果在 node 跑的话
    dcsuibian
        6
    dcsuibian  
       2022-03-03 21:23:41 +08:00
    你先说说你总体要干啥,一般变量名不应该用这种动态的方式创建
    jamfer
        7
    jamfer  
    OP
       2022-03-03 21:41:29 +08:00
    @jamfer 非常感谢,可以实现我的需求了,不过同时又遇到一个蛋疼的问题。劳驾给看一下。
    var rs;
    arr.forEach((v, i) => {
    loader.load(v+'.glb', (g)=>{
    rs = g.scene;
    });
    });
    console.log(rs);
    这种情况下,在 loader 里给 rs 赋值,在外面输出还是 undefined 。请问有没有解决办法?
    jowin
        8
    jowin  
       2022-03-03 21:48:40 +08:00
    eval(['scorner_02', 'sdoor_04', 'sdoor_03', 'sdoor_06', 'sdoor_01', 'raised_02', 'sdoor_02', 'station', 'sdoor_03', 'scorner_01'].map((v, index) => v + '=' + index).join(';'))
    MonoLogueChi
        9
    MonoLogueChi  
       2022-03-03 22:04:45 +08:00
    @jamfer #7 ,看一下 loader.load ,我猜这可能是一个异步方法
    tedding
        10
    tedding  
       2022-03-03 22:57:51 +08:00 via iPhone
    提示:浏览器( node )环境定义的变量并不是孤立存在的😂😂😂
    vace
        11
    vace  
       2022-03-03 23:25:44 +08:00   ❤️ 1
    @jamfer 建议多了解些 js 基础,区分同步与异步的区别,从上下文看,你是想加载一组 glb 模型后使用,可以用 Promise 的异步处理方法:

    ```js
    const resList = ['scorner_02','sdoor_04','sdoor_03']
    const store = new Map()
    const task = Promise.all(resList.map(key => new Promise(resolve => loader.load(key + '.glb', g => {
    resolve(g)
    store.set(key, g)
    }))))

    // 加载完成后读取资源
    task.then(() => {
    console.log(store.get('scorner_02'))
    })
    ```
    learningman
        12
    learningman  
       2022-03-04 00:58:19 +08:00
    要不 eval 吧(
    MegrezZhu
        13
    MegrezZhu  
       2022-03-04 05:04:15 +08:00
    突然有种 CMD module 的既视感
    wenzhonghu
        14
    wenzhonghu  
       2022-03-04 05:48:06 +08:00
    @jamfer 你这个所谓的创建变量,从 JS 的角度来看只是在全局空间对象里直接添加属性而不是真正意义上的创建变量
    yeqizhang
        15
    yeqizhang  
       2022-03-04 08:34:02 +08:00 via Android
    数组哪叫什么键,index 索引 下标吧
    wangtian2020
        16
    wangtian2020  
       2022-03-04 08:39:42 +08:00
    let street_01 = ['scorner_02', 'sdoor_04', 'sdoor_03', 'sdoor_06', 'sdoor_01', 'raised_02', 'sdoor_02', 'station', 'sdoor_03', 'scorner_01'];
    let obj={}
    street_01.forEach((value,index) => {
    obj[value]=index
    })
    console.log(obj.scorner_02);//0
    console.log(obj.sdoor_03);//8



    你这案例里面怎么有两个 'sdoor_03',那先转 set 数组一下?
    wangtian2020
        17
    wangtian2020  
       2022-03-04 08:40:56 +08:00
    访问对象上的以变量为属性名的属性,可以用中括号[]访问
    wangtian2020
        18
    wangtian2020  
       2022-03-04 08:45:12 +08:00
    let street_01 = ['scorner_02', 'sdoor_04', 'sdoor_03', 'sdoor_06', 'sdoor_01', 'raised_02', 'sdoor_02', 'station', 'sdoor_03', 'scorner_01'];

    street_01 = new Set(street_01)
    street_01 = Array.from(street_01)
    street_01.forEach((value,index) => {
    globalThis[value]=index
    })
    console.log(scorner_02);//0
    console.log(sdoor_03);//2
    yangzzzzzz
        19
    yangzzzzzz  
       2022-03-04 08:57:50 +08:00   ❤️ 1
    这种情况用对象不是更好吗 取值时直接用 key 取还能更精准
    RickyC
        20
    RickyC  
       2022-03-04 09:31:50 +08:00
    JS 拼接变量名,我只知道 eval()
    mxT52CRuqR6o5
        21
    mxT52CRuqR6o5  
       2022-03-04 10:38:01 +08:00
    典型的 XY 问题
    zhuweiyou
        22
    zhuweiyou  
       2022-03-04 12:35:21 +08:00
    11 楼正解
    wonderl17
        23
    wonderl17  
       2022-03-04 14:21:07 +08:00
    for (let i = 0; i < street_01.length; i++) {
    eval(`var ${street_01[i]} = ${i}`);
    }
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5723 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 39ms · UTC 06:29 · PVG 14:29 · LAX 23:29 · JFK 02:29
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.