Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Массив с массивами, получение названия (https://javascript.ru/forum/misc/52607-massiv-s-massivami-poluchenie-nazvaniya.html)

фонарик 26.12.2014 16:38

Массив с массивами, получение названия
 
Доброе время суток, помогите пожалуйста решить проблему. Есть массив, содержащий в себе другие массивы. Никак не получается получить текстовое название вложенного массива :( Как при клике на кнопку ОК вывести в алерт тектовое название массива "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>

Aetae 26.12.2014 16:51

Никак. "stone" - переменная, а никакое не название.

фонарик 26.12.2014 16:55

Ясно, спасибо :( Странно получается, есть переменная, а названия у нее нет :-?

Malleys 26.12.2014 21:30

Цитата:

Сообщение от фонарик
Странно получается, есть переменная, а названия у нее нет

Можно сделать
(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);

Aetae 26.12.2014 22:28

Но не нужно. Наркомания ибо.

krutoy 27.12.2014 18:22

Можно решить Вашу задачу "в лоб":
<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:27

Цитата:

Сообщение от Aetae
Никак. "stone" - переменная, а никакое не название.

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

А переменная -- это чуждое JS понятие, адаптированное для него из быдлоязычнов, типа жабы, паскаля, и прочего говна. В идеале, ящетаю, стоило бы избавиться от этой х*ни. Достаточно семантики сообщений.

krutoy 27.12.2014 18:35

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);

Что от этого бы изменилось?

Aetae 27.12.2014 19:22

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.