2012-02-22 8 views
1

Иногда мне нужен более сложный объект в 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?

ответ

2

Другой вариант заключается в определении объекта с прямой JSON, где массив является одно свойство, как:

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

Тогда вы бы просто получить доступ к массиву, используя myVar.values.

+0

* «Еще один вариант - определить объект с прямым json ...» * Это не JSON, это инициализатор объектов JavaScript; вы не используете JSON непосредственно в JavaScript-коде. JSON - это текстовая нотация, используемая * вне * исходного кода (например, в файлах данных или по-проводной). Если он * был * JSON, это было бы неверно (и JSON требует, чтобы ключи ["description" и "values"] находились в двойных кавычках). –

+0

справедливо - я добавил цитаты. –

+0

Но дело в том, что это не JSON. (Даже с кавычками.) Призывая его, JSON вводит в заблуждение. (Не по-крупному злобному пути, вы понимаете, в способе увековечивания недоразумений.) –

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 (иногда называется литерал объекта).

+0

Спасибо за информацию, однако я надеялся на что-то более общее. Я обновлю свой вопрос, чтобы отразить это. –

+0

@BiffMaGriff: Оба вышеизложенного довольно общие, не так ли? Вы можете добавлять произвольные, неиндексные свойства в любой массив; и вы можете добавлять индексируемые свойства к объектам, отличным от Array. –

1

Технически объект, возвращаемый функцией, не является Array, так как вы просто скопировали каждый элемент arr в новое свойство param. Вместо этого, я хотел бы сделать:

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

Таким образом, вы по-прежнему иметь доступ ко всем методам прототипа Array «s, и ArrayWithMetaData([],{}) instanceof Array == true.

Смежные вопросы