javascript,我可以在一个声明/行中执行此操作吗?

时间:2012-02-22 21:46:57

标签: javascript

有时候我需要一个更复杂的JavaScript对象,我通常会这样做。

var myVar = ArrayWithMetaData(GetStringArray(),{description: "These are numbers", ...});

function ArrayWithMetaData(arr, params){
    var temp = params;
    for(var i = 0; i < arr.length; i++)
        temp[i] = arr[i];
    return temp;
}

//TODO: Returns an array i.e. ["one", "two", "three"], may be very large 
function GetStringArray() {}

是否有更短的完成此方法或是否有提供类似功能的库?

此外,这种类型的javascript变量是否有名称?

3 个答案:

答案 0 :(得分:6)

嗯,你可以这样做:

var myVar = ["one", "two", "three"];
myVar.description = "These are numbers";

Array个实例就像对象一样(实际上,在JavaScript中,arrays aren't really arrays),您可以直接向它们添加任意属性。如果你这样做(并且有很多用例),请确保你没有错误地使用for..in(参见:Myths and realities of for..in)。

上面的内容并不完全类似于你的函数的结果,因为你的函数的结果不再是Array,而上面的数组仍然是真实的Array(所以你可以做所有只与数字属性相关的事情 - “索引” - 如果你愿意的话。如果你真的希望它不是Array,你可以这样做:

var myVar = {
    0: "one",
    1: "two",
    2: "three",
    description: "These are numbers"
};

这是object initializer(有时称为对象文字)。

答案 1 :(得分:2)

另一种选择是使用直json定义一个对象,其中数组是一个属性,如:

var myVar = {"description": "These are numbers", "values": ["one", "two", "three"]};

然后你只需使用myVar.values访问数组。

答案 2 :(得分:1)

从技术上讲,函数返回的对象不是Array,因为您只需将arr的每个项目复制到param的新属性。相反,我会这样做:

function ArrayWithMetaData(arr, params){
    for(var k in params)
        arr[k] = params[k];
    return arr;
}

这样您仍然可以访问所有Array的原型方法和ArrayWithMetaData([],{}) instanceof Array == true