我的意思是,说我有这个对象:
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
时,它是空白的。这是因为我使用的数组实际上是一个对象吗?
答案 0 :(得分:2)
变量名称没有意义,无法在JavaScript中按名称访问。正是由于这个原因,缩小过程将取代(和缩短)变量的名称。
您可以将有意义的名称作为对象的属性。
要将其应用于您的问题,您可以执行以下操作之一:
让原始对象直接包含数组:
var myObject = [{
name:"Name1",
text:"text1",
array:['a','b','c']
},{
name:"Name2",
text:"text2",
array:['x','y','z']
}];
让一个单独的对象包含数组作为命名属性:
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;
}
}