26.12.2014, 16:38
|
Кандидат Javascript-наук
|
|
Регистрация: 23.02.2013
Сообщений: 127
|
|
Массив с массивами, получение названия
Доброе время суток, помогите пожалуйста решить проблему. Есть массив, содержащий в себе другие массивы. Никак не получается получить текстовое название вложенного массива Как при клике на кнопку ОК вывести в алерт тектовое название массива "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>
|
|
26.12.2014, 16:51
|
|
Тлен
|
|
Регистрация: 02.01.2010
Сообщений: 6,584
|
|
Никак. "stone" - переменная, а никакое не название.
__________________
29375, 35
|
|
26.12.2014, 16:55
|
Кандидат Javascript-наук
|
|
Регистрация: 23.02.2013
Сообщений: 127
|
|
Ясно, спасибо Странно получается, есть переменная, а названия у нее нет
|
|
26.12.2014, 21:30
|
|
Профессор
|
|
Регистрация: 20.12.2009
Сообщений: 1,714
|
|
Сообщение от фонарик
|
Странно получается, есть переменная, а названия у нее нет
|
Можно сделать
(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);
|
|
26.12.2014, 22:28
|
|
Тлен
|
|
Регистрация: 02.01.2010
Сообщений: 6,584
|
|
Но не нужно. Наркомания ибо.
__________________
29375, 35
|
|
27.12.2014, 18:22
|
Профессор
|
|
Регистрация: 09.11.2014
Сообщений: 610
|
|
Можно решить Вашу задачу "в лоб":
<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>
Но такое решение может сказаться на производительности, поскольку в глобале может быть очень много имен, цикл будет проходить их все, пока не наткнется на нужный объект. К тому же, один и тот же объект может иметь несколько имен. Лучше сразу вынести определения массивов в отдельный неймспейс, если есть такая возможность.
Последний раз редактировалось krutoy, 27.12.2014 в 18:39.
|
|
27.12.2014, 18:27
|
Профессор
|
|
Регистрация: 09.11.2014
Сообщений: 610
|
|
Сообщение от Aetae
|
Никак. "stone" - переменная, а никакое не название.
|
В JS все переменные есть свойства, которые можно трактовать и как имена(которые суть названия). По сути -- это предикаты для приема сообщения -- что объект должен ответить -- то, се, не знаю.
А переменная -- это чуждое JS понятие, адаптированное для него из быдлоязычнов, типа жабы, паскаля, и прочего говна. В идеале, ящетаю, стоило бы избавиться от этой х*ни. Достаточно семантики сообщений.
|
|
27.12.2014, 18:35
|
Профессор
|
|
Регистрация: 09.11.2014
Сообщений: 610
|
|
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);
Что от этого бы изменилось?
|
|
27.12.2014, 19:22
|
|
Тлен
|
|
Регистрация: 02.01.2010
Сообщений: 6,584
|
|
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>
и всё как оп хочет будет. Только это бред, и не имеет никакой логичной практической цели.
__________________
29375, 35
|
|
|
|