推荐关注
› Meteor
› JSLint - a JavaScript code quality tool
› jsFiddle
› D3.js
› WebStorm
推荐书目
› JavaScript 权威指南第 5 版
› Closure: The Definitive Guide
jamfer

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

  •  
  •   jamfer · Mar 3, 2022 · 3480 views
    This topic created in 1708 days ago, the information mentioned may be changed or developed.
    现在有一个数组:
    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
    KMpAn8Obw1QhPoEP
    Mar 3, 2022 via Android
    1
    const map = new Map (arr.map((v, i)=> [v, i]));
    map.get(v);
    zcf0508
    zcf0508
    Mar 3, 2022 via Android
    2
    findIndex ?
    jamfer
    jamfer
    OP
    Mar 3, 2022
    3
    @enchilada2020 我并不是想要利用值得到键,我主要是想要用遍历数组批量创建变量。为了好描述一些帖子简化了。
    KMpAn8Obw1QhPoEP
    KMpAn8Obw1QhPoEP
    Mar 3, 2022 via Android❤️1
    4
    @jamfer arr.forEach ((v. i) => window[v] = i)
    KMpAn8Obw1QhPoEP
    KMpAn8Obw1QhPoEP
    Mar 3, 2022 via Android
    5
    @enchilada2020 或者把 window 换成 globalThis 如果在 node 跑的话
    dcsuibian
    dcsuibian
    Mar 3, 2022
    6
    你先说说你总体要干啥,一般变量名不应该用这种动态的方式创建
    jamfer
    jamfer
    OP
    Mar 3, 2022
    7
    @jamfer 非常感谢,可以实现我的需求了,不过同时又遇到一个蛋疼的问题。劳驾给看一下。
    var rs;
    arr.forEach((v, i) => {
    loader.load(v+'.glb', (g)=>{
    rs = g.scene;
    });
    });
    console.log(rs);
    这种情况下,在 loader 里给 rs 赋值,在外面输出还是 undefined 。请问有没有解决办法?
    jowin
    jowin
    Mar 3, 2022
    8
    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
    MonoLogueChi
    Mar 3, 2022
    9
    @jamfer #7 ,看一下 loader.load ,我猜这可能是一个异步方法
    tedding
    tedding
    Mar 3, 2022 via iPhone
    10
    提示:浏览器( node )环境定义的变量并不是孤立存在的😂😂😂
    vace
    vace
    Mar 3, 2022❤️1
    11
    @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
    learningman
    Mar 4, 2022
    12
    要不 eval 吧(
    MegrezZhu
    MegrezZhu
    Mar 4, 2022
    13
    突然有种 CMD module 的既视感
    wenzhonghu
    wenzhonghu
    Mar 4, 2022
    14
    @jamfer 你这个所谓的创建变量,从 JS 的角度来看只是在全局空间对象里直接添加属性而不是真正意义上的创建变量
    yungo8
    yungo8
    Mar 4, 2022 via Android
    15
    数组哪叫什么键,index 索引 下标吧
    wangtian2020
    wangtian2020
    Mar 4, 2022
    16
    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
    wangtian2020
    Mar 4, 2022
    17
    访问对象上的以变量为属性名的属性,可以用中括号[]访问
    wangtian2020
    wangtian2020
    Mar 4, 2022
    18
    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
    yangzzzzzz
    Mar 4, 2022❤️1
    19
    这种情况用对象不是更好吗 取值时直接用 key 取还能更精准
    RickyC
    RickyC
    Mar 4, 2022
    20
    JS 拼接变量名,我只知道 eval()
    mxT52CRuqR6o5
    mxT52CRuqR6o5
    Mar 4, 2022
    21
    典型的 XY 问题
    zhuweiyou
    zhuweiyou
    Mar 4, 2022
    22
    11 楼正解
    wonderl17
    wonderl17
    Mar 4, 2022
    23
    for (let i = 0; i < street_01.length; i++) {
    eval(`var ${street_01[i]} = ${i}`);
    }
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   3195 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 78ms · UTC 04:30 · PVG 12:30 · LAX 20:30 · JFK 23:30
    ♥ Do have faith in what you're doing.