Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 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>
Ответить с цитированием
  #2 (permalink)  
Старый 26.12.2014, 16:51
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,584

Никак. "stone" - переменная, а никакое не название.
__________________
29375, 35
Ответить с цитированием
  #3 (permalink)  
Старый 26.12.2014, 16:55
Кандидат Javascript-наук
Отправить личное сообщение для фонарик Посмотреть профиль Найти все сообщения от фонарик
 
Регистрация: 23.02.2013
Сообщений: 127

Ясно, спасибо Странно получается, есть переменная, а названия у нее нет
Ответить с цитированием
  #4 (permalink)  
Старый 26.12.2014, 21:30
Аватар для Malleys
Профессор
Отправить личное сообщение для Malleys Посмотреть профиль Найти все сообщения от Malleys
 
Регистрация: 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);
Ответить с цитированием
  #5 (permalink)  
Старый 26.12.2014, 22:28
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,584

Но не нужно. Наркомания ибо.
__________________
29375, 35
Ответить с цитированием
  #6 (permalink)  
Старый 27.12.2014, 18:22
Профессор
Посмотреть профиль Найти все сообщения от krutoy
 
Регистрация: 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.
Ответить с цитированием
  #7 (permalink)  
Старый 27.12.2014, 18:27
Профессор
Посмотреть профиль Найти все сообщения от krutoy
 
Регистрация: 09.11.2014
Сообщений: 610

Сообщение от Aetae
Никак. "stone" - переменная, а никакое не название.
В JS все переменные есть свойства, которые можно трактовать и как имена(которые суть названия). По сути -- это предикаты для приема сообщения -- что объект должен ответить -- то, се, не знаю.

А переменная -- это чуждое JS понятие, адаптированное для него из быдлоязычнов, типа жабы, паскаля, и прочего говна. В идеале, ящетаю, стоило бы избавиться от этой х*ни. Достаточно семантики сообщений.
Ответить с цитированием
  #8 (permalink)  
Старый 27.12.2014, 18:35
Профессор
Посмотреть профиль Найти все сообщения от krutoy
 
Регистрация: 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);

Что от этого бы изменилось?
Ответить с цитированием
  #9 (permalink)  
Старый 27.12.2014, 19:22
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 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
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как в шаблоне диррективы узнать массив это или строка? delias Angular.js 1 18.03.2014 07:33
Получение переменной из названия! KupueIIIKo Общие вопросы Javascript 8 12.01.2013 17:22
как запихнуть в массив оператор ? mitiya Общие вопросы Javascript 2 09.02.2011 18:57
Как создать многомерный массив FRIE Общие вопросы Javascript 29 02.06.2010 19:14
Подскажите, как вернуть js-скрипт массив Polkan AJAX и COMET 18 30.04.2010 23:30