动态数组名javascript

动态数组名javascript,javascript,arrays,dynamic,eval,Javascript,Arrays,Dynamic,Eval,我有几个名称相似的数组 ArrayTop[] ArrayLeft[] ArrayRight[] ArrayWidth[] 我试图在函数中动态设置名称,然后设置值 我已经尝试了许多动态选择正确阵列的方法,但还没有找到解决方案 function setarray(a,b,c){ eval(Array+a+[b])=c } setarray('Top',5,100) 在这个例子中,我试图设置 ArrayTop[5]=100 如果您在浏览器中执行此操作,一种可能的解决方案是

我有几个名称相似的数组

ArrayTop[]  
ArrayLeft[]   
ArrayRight[]  
ArrayWidth[]
我试图在函数中动态设置名称,然后设置值

我已经尝试了许多动态选择正确阵列的方法,但还没有找到解决方案

function setarray(a,b,c){
    eval(Array+a+[b])=c
}

setarray('Top',5,100)
在这个例子中,我试图设置

ArrayTop[5]=100

如果您在浏览器中执行此操作,一种可能的解决方案是:

function setArray(a, b, c){
    window['Array' + a][b] = c;
}

setArray('Top', 5, 100);
我建议所有数组都包含在某个对象中,不要污染全局名称空间。所以它更像是:

var arrays = {
    ArrayTop: [],
    ArrayNorth: []
};

function setArray(a, b, c){
    arrays['Array' + a][b] = c;
}

setArray('Top', 5, 100);

我不建议使用eval。Eval不适用于这种动态评估,它是一个巨大的性能打击。

您可以这样做:

function setarray(a,b,c){
    window['Array' + a][b] = c;
}

setarray('Top',5,100)

然而,你不应该这样做。使用二维数组或对象或其他东西。这个答案的目的只是表明它是可以做到的,而不是应该做到的。

将所有数组放入一个对象中:

var myArrays = { 
    top : arrayTop,
    left: arrayLeft,
    right: arrayRight,
    bottom: arrayBottom
}
要获得阵列,您可以:

myArrays["top"][5] = 100;
或者,您可以跳过将数组定义为全局变量,只需执行以下操作:

var myArrays = { 
    top : [],
    left: [],
    right: [],
    bottom: []
}
它初始化4个可填充的空数组:

myArrays["top"][0] = 100;

但是,如果
top
left
right
bottom
都是相关的(指同一个对象),则创建具有这些属性的对象并创建这些对象的单个数组可能更有意义:

function MyObj(top, left, right, bottom) {
   this.top = top;
   this.left = left;
   this.right = right;
   this.bottom = bottom;
}

var myArray = [];

myArray.push(new MyObj(1,2,3,4));
console.log(myArray[0]);

myArray[0].left = 7;
console.log(myArray[0]);

您错过了,该数组必须是字符串=>“数组”。 那你就可以了

var postfix = "Top"; 
var a = eval("new Array"+postfix);
a.push(100);

哈希映射将是一个完美的工具:

var arrays = {
  top: [],
  left: [],
  right: [],
  bottom: []
};

function addToArray(name, index, value) {
  arrays[name][index] = value;
}

addToArray('top', 5, 100);
我冒昧地说出了更明确的名字

我还建议两种良好做法:

  • 不要使用eval。Eval并不适用于这种动态评估。对你来说,这是一个性能杀手

  • 不要破坏全局命名空间。在浏览器环境中,避免向窗口(全局)添加内容


    • 为什么不使用对象为数组编制索引

      var arrayNames=["top","left","right","bottom"]
      var data=[1,2,3,4,5];
      var arrays={};
      
      arrayNames.forEach(function(x){
          arrays[x]=data;
      });    
      
      因此,您可以通过名称获取阵列。
      如果您随机或自动生成名称,没有问题。

      尝试类似的方法

      var someArr = {
      
      };
      someArr.ArrayTop = [];
      
      function setarray(a, b, c) {
      
          var arrName = "Array" + a;
          someArr[arrName][b] = c;
      }
      
      
      setarray('Top', 5, 100)
      
      alert(someArr.ArrayTop[5]);
      
      希望这能奏效。
      以下是

      为什么不使用数组数组?因此,您知道是arr[0]bot是arr[1],或者您也可以使用数组对象,这样您就可以拥有数组的名称。使用多维数组时,假定
      ArrayTop[0]
      ArrayLeft[0]
      是相关的,但情况可能并非如此。他们可能是,但问题中没有足够的背景。如果是,我会说使用一个带有
      top
      left
      right
      bottom
      属性的对象数组。这些数组基于div对象的样式。是的,它们都是相关的
      var someArr = {
      
      };
      someArr.ArrayTop = [];
      
      function setarray(a, b, c) {
      
          var arrName = "Array" + a;
          someArr[arrName][b] = c;
      }
      
      
      setarray('Top', 5, 100)
      
      alert(someArr.ArrayTop[5]);