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

2022-03-03 21:05:23 +08:00
 jamfer
现在有一个数组:
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
......


请问该怎么写遍历?
2393 次点击
所在节点    JavaScript
23 条回复
enchilada2020
2022-03-03 21:10:27 +08:00
const map = new Map (arr.map((v, i)=> [v, i]));
map.get(v);
zcf0508
2022-03-03 21:16:06 +08:00
findIndex ?
jamfer
2022-03-03 21:16:10 +08:00
@enchilada2020 我并不是想要利用值得到键,我主要是想要用遍历数组批量创建变量。为了好描述一些帖子简化了。
enchilada2020
2022-03-03 21:20:57 +08:00
@jamfer arr.forEach ((v. i) => window[v] = i)
enchilada2020
2022-03-03 21:22:39 +08:00
@enchilada2020 或者把 window 换成 globalThis 如果在 node 跑的话
dcsuibian
2022-03-03 21:23:41 +08:00
你先说说你总体要干啥,一般变量名不应该用这种动态的方式创建
jamfer
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
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
2022-03-03 22:04:45 +08:00
@jamfer #7 ,看一下 loader.load ,我猜这可能是一个异步方法
tedding
2022-03-03 22:57:51 +08:00
提示:浏览器( node )环境定义的变量并不是孤立存在的😂😂😂
vace
2022-03-03 23:25:44 +08:00
@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
2022-03-04 00:58:19 +08:00
要不 eval 吧(
MegrezZhu
2022-03-04 05:04:15 +08:00
突然有种 CMD module 的既视感
wenzhonghu
2022-03-04 05:48:06 +08:00
@jamfer 你这个所谓的创建变量,从 JS 的角度来看只是在全局空间对象里直接添加属性而不是真正意义上的创建变量
yeqizhang
2022-03-04 08:34:02 +08:00
数组哪叫什么键,index 索引 下标吧
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
2022-03-04 08:40:56 +08:00
访问对象上的以变量为属性名的属性,可以用中括号[]访问
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
2022-03-04 08:57:50 +08:00
这种情况用对象不是更好吗 取值时直接用 key 取还能更精准
RickyC
2022-03-04 09:31:50 +08:00
JS 拼接变量名,我只知道 eval()

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/837803

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX