如何在对象中存储数组名称以便以后动态选择?

时间:2015-07-30 18:24:10

标签: javascript arrays

我的意思是,说我有这个对象:

var myObject = [{
  name:"Name1",
  text:"text1",
  array:"firstArray"
},{
  name:"Name2",
  text:"text2",
  array:"secondArray"
}];

稍后在代码中有这样的:

useArray=[];
firstArray=['a','b','c'];
secondArray=['x','y','z'];

然后,有一个条件语句决定使用哪个数组,而不是像这样用手输入:

if(selection = "Name1"){
  useArray = firstArray;
}
else if(selection = "Name2"){
  useArray = secondArray;
}

我希望能够让它变得动态,这样无论物体有多长,它都能起作用。像这样:

for(i=0;i<myObject.length;i++){
   if(selection == myObject[i].name){
       useArray = myObject[i].array;
   }
}

但遗憾的是,这并不奏效。在对象中,我甚至尝试取出数组周围的引号,并在对象之前声明数组,但这也不起作用。

数组出现空或未定义。

我知道这与字符串或其他东西有关,那么实现这一目的的解决方法是什么?

我意识到我应该以不同的方式制作我的阵列。如果数组实际上只是更多的对象怎么办?下面的答案看起来很漂亮,我认为阿米特和其他类似的答案可以解决问题。但是我实际上试图解决的问题的区别在于,首先,我的数组开始为空,所以我在这里:

var myObject = [{
  name:"Name1",
  text:"text1",
  array:[]
},{
  name:"Name2",
  text:"text2",
  array:[]
}];

然后我补充道:

var arrays={
    firstArray:[],
    secondArray:[]
}

同样,它开始是空的。正如我原来的问题所指出的,稍后在代码中填充数组。为了更加准确和清晰,这就是它的完成方式:

arrays.firstArray.push({
  floor:myObjects[c].name, text:myObject[c].text
});

它处于for循环中,但这是无关紧要的。

我的for循环设置就像这样:

for(i=0;i<myObject.length;i++){
  if(selection == myObject[i].name){
    useArray = arrays[myObject[i].array];
  }
}

但是当我提醒useArray时,它是空白的。这是因为我使用的数组实际上是一个对象吗?

8 个答案:

答案 0 :(得分:2)

变量名称没有意义,无法在JavaScript中按名称访问。正是由于这个原因,缩小过程将取代(和缩短)变量的名称。

您可以将有意义的名称作为对象的属性。

要将其应用于您的问题,您可以执行以下操作之一:

  1. 让原始对象直接包含数组:

    var myObject = [{
        name:"Name1",
        text:"text1",
        array:['a','b','c']
      },{
        name:"Name2",
        text:"text2",
        array:['x','y','z']
    }];
    
  2. 让一个单独的对象包含数组作为命名属性:

    var arrays = {
      firstArray: ['a','b','c'],
      secondArray: ['x','y','z']
    }
    var useArray;
    for(i=0;i<myObject.length;i++){
      if(selection == myObject[i].name){
        useArray = arrays[myObject[i].array];
      }
    }
    

答案 1 :(得分:1)

Working JSFiddle。尝试使用forEach

myObject.forEach(function(item) {
  if (selection === item.name) {
    useArray = item.array
  }
}

myObject中的名称绝对可以引用您的数组。从变量名中取出引号,并将数组声明为myObject以上。完整代码:

var useArray=[];
var firstArray=['a','b','c'];
var secondArray=['x','y','z'];
var selection = "Name2";

var myObject = [{
      name:"Name1",
      text:"text1",
      array:firstArray
    },{
      name:"Name2",
      text:"text2",
      array:secondArray
    }];

myObject.forEach(function(item) {
  if (selection === item.name) {
    useArray = item.array
  }
})

console.log(useArray);

答案 2 :(得分:1)

您可以拥有一个数组列表,并通过获取其名称在useArray内设置for()。就像这样:

var arrayList = {
  firstArray: ['a','b','c'],
  secondArray:['x','y','z']
};

然后:

for(i=0;i<myObject.length;i++){
   if(selection == myObject[i].name){
       useArray = arrayList[myObject[i].array];
   }
}

澄清为何有效:

鉴于

var foo = {bar: 1};

您可以使用以下任何语法访问bar属性:

foo.bar // returns 1
foo['bar'] // returns 1

答案 3 :(得分:0)

将其更改为:

var myObject = [{
  name:"Name1",
  text:"text1",
  array:['a','b','c']
},{
  name:"Name2",
  text:"text2",
  array:['x','y','z']
}];

您正在分配字符串,但只是拥有名称绑定的字符串不起作用。您需要分配给实际的数组。

答案 4 :(得分:0)

我建议您在对象中存储对实际数组的引用,就像这样。

var firstArray=['a','b','c'];
var secondArray=['x','y','z'];

var myObject = [{
  name:"Name1",
  text:"text1",
  array:firstArray
},{
  name:"Name2",
  text:"text2",
  array:secondArray
}];

var selection = "Name1";

for(i=0;i<myObject.length;i++){
   if(selection == myObject[i].name){
       alert(myObject[i].array);
   }
}

答案 5 :(得分:0)

如果您要做的是通过字符串引用数组,您可以这样做:

var selection = 'Name2';

var myObject = [{
  name:"Name1",
  text:"text1",
  array:"firstArray"
},{
  name:"Name2",
  text:"text2",
  array:"secondArray"
}];

useArray=[];
allArrays = {
  firstArray:['a','b','c'],
  secondArray:['x','y','z']
}

for(i=0;i<myObject.length;i++){
  if(selection == myObject[i].name){
    useArray = allArrays[myObject[i].array];
  }
}

console.log(useArray);

答案 6 :(得分:0)

尝试:

for(i=0;i<myObject.length;i++){
   if(selection == myObject[i].name){
       useArray = window[myObject[i].array];
       //         ^^^^^^
   }
}    

答案 7 :(得分:0)

试试这个:

for(key in myObject){
    if(section == myObject[key].name){
        useArray = myObject[key].array;
    }
}

这是小提琴:http://jsfiddle.net/ydxf4b0g/