dynamic array names javascript

2019-01-28 01:14发布

问题:

I have a few arrays with like names.

ArrayTop[]  
ArrayLeft[]   
ArrayRight[]  
ArrayWidth[]

I am trying to set the name dynamically in a function and then set value.

I have tried many ways of dynamically picking the right array but have not come up with a solution.

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

setarray('Top',5,100)

In this example i am trying to set.

ArrayTop[5]=100

回答1:

If you are doing this in the browser, one possible solution would be to do:

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

setArray('Top', 5, 100);

I would recommend that all your array's be contained in some object and not pollute the global namespace. So it would be more like:

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

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

setArray('Top', 5, 100);

I would not recommend using eval. Eval is not meant for this kind of dynamic evaluation and it is a huge performance hit.



回答2:

Hash map will be a perfect tool:

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

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

addToArray('top', 5, 100);

I took the liberty to give more explicit names.

I suggest also two good practices:

  • do not use eval. Eval is not meant for this kind of dynamic evaluation. In your case, it's a performance killer

  • do not polute the global namespace. In browser environnement, avoid adding stuff to window (which is global).



回答3:

Why not indexing your array with an object?

var arrayNames=["top","left","right","bottom"]
var data=[1,2,3,4,5];
var arrays={};

arrayNames.forEach(function(x){
    arrays[x]=data;
});    

So you could get your Array via Name. If you randomize or autogenerate the names, no prob.



回答4:

You can do it this way:

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

setarray('Top',5,100)

However, you shouldn't be doing this. Use a 2D array or an object or something. The purpose of this answer is just to show that it CAN be done, not that it SHOULD be done.



回答5:

You missed, that Array has to be a String => "Array". Then you can do

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


回答6:

try something like this

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]);

Hope this works. Here is the fiddle



回答7:

Put all your arrays into an object:

var myArrays = { 
    top : arrayTop,
    left: arrayLeft,
    right: arrayRight,
    bottom: arrayBottom
}

And the to get an array you can just:

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

Or you can skip defining the arrays as global variables and just do something like:

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

Which initializes 4 empty arrays which you can populate:

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

or

myArrays.top[0] = 100;

However, if top, left, right and bottom all are related (refering to the same object), it might make more sense to create an object with those properties and create a single array of those objects:

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]);

http://jsfiddle.net/UNuF8/