【问题标题】:How can I dynamically name an array in Javascript?如何在Javascript中动态命名数组?
【发布时间】:2010-07-20 16:56:02
【问题描述】:

我正在使用 jQuery 和 JSON 从数据库中提取数据。数据库的每一行都是一个不同的产品,每个产品都有许多与之关联的属性。

我在 js 中尝试做的是为每个包含所有产品属性的产品创建一个命名数组。我知道如何从 JSON 中提取数据。我知道如何构造数组。

我不知道如何动态创建数组名。有人可以帮帮我吗?

我正在尝试根据数据库中的字段来命名数组。在我现有的工作脚本的结构中,它被引用为 data.cssid。我想使用 data.cssid 的值作为数组的名称,然后填充数组。

$.getJSON("products.php",function(data){
    $.each(data.products, function(i,data){
        var data.cssid = new Array();
        data.cssid[0] = data.productid;
        ...
        etc
    });
});

我知道上面的代码是完全错误的,但它说明了这个想法。在我声明“var data.cssid”的地方,我想使用data.cssid的实际值作为新数组的名称。

编辑:

我已经尝试过这里提到的方法(eval 除外)。代码如下,与我原来的帖子并没有什么不同,只是我使用的是 Object 构造函数。

$(document).ready(function(){
$.getJSON("productscript.php",function(data){
    $.each(data.products, function(i,data){
        var arrayName = data.cssid;
        obj[arrayName] = new Array();
        obj[arrayName][0] = data.productid;
        obj[arrayName][1] = data.productname;
        obj[arrayName][2] = data.cssid;
        obj[arrayName][3] = data.benefits;
        alert(obj[arrayName]); //WORKS
        alert(obj.shoe); //WORKS WHEN arrayName = shoe, otherwise undefined
    });
});
});

非特定 obj[arrayName] 的警报有效,并显示了所有华丽的数组。 但是,当我尝试通过名称 alert(obj.shoe) 访问特定数组时,它仅在 arrayName = shoe 时有效。下一次迭代失败,无法在此函数之外访问。

我希望这有助于澄清问题以及如何解决它。我非常感谢所有的意见,并且正在尝试你们提出的所有建议。

进展(解决方案):

$(document).ready(function(){
$.getJSON("productscript.php",function(data){
    $.each(data.products, function(i,data){
        var arrayName = data.cssid;
        window[arrayName] = new Array();
        var arr = window[data.cssid];
        arr[0] = data.productid;
        arr[1] = data.productname;
        arr[2] = data.cssid;
        arr[3] = data.benefits;
        alert(window[arrayName]); //WORKS
        alert(arrayName); //WORKS
        alert(shoe); //WORKS

    });
});
});
function showAlert() {
    alert(shoe); //WORKS when activated by button click
}

感谢大家的意见。

【问题讨论】:

  • 为什么?你想用这个变量做什么?
  • 您可以使用eval,但我不会将其作为答案,因为这可能不是一个好主意。例如。 eval('var ' + data.cssid + ' = new Array()');
  • 我正在尝试在其他脚本中使用每个产品的属性。我最初构建它是为了从 JSON 输出必要的 html。现在我认为我需要让它更灵活,并且正在考虑先构造数组,然后访问数组来构造 html 和公式将是正确的方法。因此,当我为产品“鞋”构建 HTML 时,我会访问数组并将变量插入到我的脚本中。
  • 史蒂文,我也看到了那个方法,还读到 eval 是邪恶的,所以我试图避免这种情况。不过,我承认我不知道为什么 eval 是邪恶的。
  • 在这里参考你的第二个代码块 - 你试过把“var obj = {};”在您希望它存在的范围内,例如在顶部?否则,您可能只是在每次循环迭代中创建一个新的 obj 变量,然后将其丢弃。

标签: javascript jquery arrays


【解决方案1】:

您还希望数组位于data 对象上吗?

data[data.cssid] = new Array();

否则,您可以将其分配给任何其他对象。将其分配给window 对象,将使其全局可用

window[data.cssid] = new Array();

... 那么如果data.cssid 的值为"abc" 那么你可以像这样访问它

abc[0] = data.productid;

【讨论】:

  • 我确实希望能够在全球范围内访问这些数组。 1. 如何使用 window[] 方法填充数组?会不会是:window[data.cssid][0] = data.products; 2. 这样构造后如何访问数组?如果 data.cssid 的值为“shoe”,我可以使用 shoe[i] 或其他语法访问数组吗?
  • 您仍然必须使用window["shoe"]。除非你知道它是鞋子和硬编码shoe。 x[ str ] 是使用字符串访问 x 上的属性的方式(与 x.prop 相对)。
  • 大卫,如果我不知道 data.cssid 的值,我将如何填充?
  • @Duffy Dolan:是的,你可以写window[data.cssid][0] = data.products;,也可以写window[data.cssid] = new Array(); var arr = window[data.cssid]; arr[0] = data.products。 2.你也可以访问它window[data.cssid][0],或者,如果你知道data.cssid"shoe",你可以写shoe[0]
  • 大卫,检查我帖子中的进度编辑。使用这种方法让我比以往任何时候都更接近,但是当我尝试从原始函数之外访问数组时我失败了。
【解决方案2】:

不,不可能。 PHP有“变量”; Javascript 没有。

但是,您可以将数组分配给现存的对象:

var obj = {};
var name = 'foo';
obj[name] = 1;

alert(obj.foo) // alerts "1"

老实说,我不确定你为什么需要这种能力。您可以发布更多代码吗?如果上述方法没有帮助,可能有一个不错的解决方法。

【讨论】:

  • 我正在尝试这个和其他方法。如果我不能正常工作,我会尽快发布并包含更多代码。
【解决方案3】:

您可以像这样通过名称为对象设置属性:

var obj = {};  //Or, new Object()
obj[data.cssid] = new Array();

但是,如果您只是创建一个局部变量,那就没有意义了;您可以简单地将数组命名为 newData(或类似名称),因为您一次只能处理一个数组。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-01
    • 2011-10-27
    • 2023-03-26
    • 2013-03-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多