有时候我需要一个更复杂的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变量是否有名称?
答案 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
。