请教一个前端 JS 以数组值作为变量名的问题 - V2EX
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 2832 次点击
    这是一个创建于 1368 天前的主题,其中的信息可能已经有所发展或是发生改变。
    现在有一个数组:
    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
    ......


    请问该怎么写遍历?
    KMpAn8Obw1QhPoEP
        1
    KMpAn8Obw1QhPoEP  
       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 我并不是想要利用值得到键,我主要是想要用遍历数组批量创建变量。为了好描述一些帖子简化了。
    KMpAn8Obw1QhPoEP
        4
    KMpAn8Obw1QhPoEP  
       2022-03-03 21:20:57 +08:00 via Android   1
    @jamfer arr.forEach ((v. i) => window[v] = i)
    KMpAn8Obw1QhPoEP
        5
    KMpAn8Obw1QhPoEP  
       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(storeget('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     Solana     1038 人在线   span class="fade">最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 28ms UTC 23:34 PVG 07:34 LAX 15:34 JFK 18:34
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86