Массив с массивами, получение названия
Доброе время суток, помогите пожалуйста решить проблему. Есть массив, содержащий в себе другие массивы. Никак не получается получить текстовое название вложенного массива :( Как при клике на кнопку ОК вывести в алерт тектовое название массива "stone", а не его элементы?
<div onclick="alert(arr[1])" style="width:40px; cursor:pointer; border:1px solid blue; text-align:center">OK</div> <script> var stone = ["rubin", "almaz", "izumrud", "sapfir"] var apple = ["green", "red", "bad"] var error = ["text", "number", "img"] var arr = ["", stone, apple, error] </script> |
Никак. "stone" - переменная, а никакое не название.
|
Ясно, спасибо :( Странно получается, есть переменная, а названия у нее нет :-?
|
Цитата:
(function(global) { function define(name, object) { object.name = name; global[name] = object; return object; } global.define = define; })(this); define('stone', ["rubin", "almaz", "izumrud", "sapfir"]); define('apple', ["green", "red", "bad"]); define('error', ["text", "number", "img"]); define('arr', ["", stone, apple, error]); alert(arr[1].name); |
Но не нужно. Наркомания ибо.
|
Можно решить Вашу задачу "в лоб":
<html> <head> </head> <body> <div onclick="alert(byName(arr[1]))" style="width:40px; cursor:pointer; border:1px solid blue; text-align:center">OK</div> <div onclick="alert(byName(arr[2]))" style="width:40px; cursor:pointer; border:1px solid blue; text-align:center">OK</div> <div onclick="alert(byName(arr[3]))" style="width:40px; cursor:pointer; border:1px solid blue; text-align:center">OK</div> <script> byName=function(ob){ for(var i in this){ if(this[i]===ob) return i }} var stone = ["rubin", "almaz", "izumrud", "sapfir"] var apple = ["green", "red", "bad"] var error = ["text", "number", "img"] var arr = ["", stone, apple, error] </script> </body> </html> Но такое решение может сказаться на производительности, поскольку в глобале может быть очень много имен, цикл будет проходить их все, пока не наткнется на нужный объект. К тому же, один и тот же объект может иметь несколько имен. Лучше сразу вынести определения массивов в отдельный неймспейс, если есть такая возможность. |
Цитата:
А переменная -- это чуждое JS понятие, адаптированное для него из быдлоязычнов, типа жабы, паскаля, и прочего говна. В идеале, ящетаю, стоило бы избавиться от этой х*ни. Достаточно семантики сообщений. |
Malleys,
А в чем смысл Вашей обертки? Если бы вы написали вот так function define(name, object) { object.name = name; window[name] = object; // return object; -- это тоже, кстати, не нужно } define('stone', ["rubin", "almaz", "izumrud", "sapfir"]); define('apple', ["green", "red", "bad"]); define('error', ["text", "number", "img"]); define('arr', ["", stone, apple, error]); alert(arr[1].name); Что от этого бы изменилось? |
krutoy, привычка у него такая, хорошая.
Ещё можно написать вот так: <div onclick="alert(arr[1])" style="width:40px; cursor:pointer; border:1px solid blue; text-align:center">OK</div> <script> function define(name, object) { object.toString = function(){ return name }; window[name] = object; } define('stone', ["rubin", "almaz", "izumrud", "sapfir"]); define('apple', ["green", "red", "bad"]); define('error', ["text", "number", "img"]); var arr = ["", stone, apple, error] </script>и всё как оп хочет будет. Только это бред, и не имеет никакой логичной практической цели. |
Часовой пояс GMT +3, время: 19:58. |