Получить имя массива или объекта с помощью Javascript - PullRequest
0 голосов
/ 24 июня 2018

У меня довольно глупый, но запутанный вопрос. Как мы можем получить имя существующего массива или объекта?

Например:

thisObject={ first:1, second:2};
thisArray=[1,2,3,4]

Я хочу получить строку "thisObject", "thisArray".

Как мы можем получить это?

Большое спасибо.


Отредактировано:

Для более конкретной информации. Я хочу сделать что-то вроде этого: console.log(someFunction(thisObject))

потом вернемся

"thisObject"


Отредактировано-2:

const firstArray=[1,2,3] 
const secondArray=["a","b"] 
const render=(arr)=>arr.map(arrr=>console.log(Object.keys({arr})[0]))
render(firstArray)
render(secondArray)

вернется

"arr" "arr" 

вместо

"firstArray" "secondArray"

Ответы [ 3 ]

0 голосов
/ 24 июня 2018

Вы не можете на самом деле выполнить то, что вы пытаетесь сделать в Javascript, но есть небольшая небольшая хитрость, которую вы можете использовать для регистрации имени объекта без прямой печати его , Это не особенно полезно и не будет работать, если вы пытаетесь получить исходное имя аргумента функции, но вы можете сделать:

console.log(Object.keys({thisObject})[0]);
// "thisObject"

Как я уже сказал, это не особенно полезно, но я буду шокирован, если вы сможете сделать что-то лучше.

0 голосов
/ 24 июня 2018

В JavaScript переменные ссылаются на объекты, но сами объекты не названы.Итак, учитывая объект, вы не можете спросить его имя;это не имеет смысла.Когда вы думаете о том, как ссылки передаются в javascript, вы понимаете, насколько проблематичным является то, что вы пытаетесь сделать в общем случае.Например, рассмотрим следующее:

var a = {first_name: "Mark"};
var b = a;
// a and b both point to the same object

Если я спрашиваю имя этого объекта, должно ли оно возвращать a, b или оба?А теперь:

var a = {first_name: "Mark"};
var b = a;
a = undefined;

Это еще сложнее, если учесть, что на один и тот же объект могут ссылаться имена в разных областях и модулях.Например:

var a = {first_name: "Mark"};
function test(obj) {
   var t = obj;
   getNames(obj) // <-- what should that return? a? obj? t? all of them?
}

Дайте определенную область видимости, вы могли бы перебрать имена и найти те, которые соответствуют вашему объекту, , но это будет хрупким и, вероятно,неэффективно .

var a = {first_name: "Mark"}
var b = a
var c = {foo: "bar"}

function getNames(obj, scope) {
  for (name in scope){
    try {
      if (scope[name] === obj) console.log(name)
    } catch(e){continue} // avoid localStorage security error
  }
 }
 
 getNames(b, this) // should log 'a' and 'b' because both are in global scope

Но опять же приведенный выше код на самом деле не дает вам имя объекта, он просто просматривает каждое имя в определенном объекте (в этомрегистр глобального объекта) и и видит, какие из свойств объекта указывают на рассматриваемый объект.

Конечно, не все объекты, находящиеся в области видимости, даже имеют имена.Например: *

let arr = [{foo: "bar"}, {foo: "baz"}]
getNames(arr[0]) // <-- what should that return?

Если имя объекта важно и вы хотите его отобразить, вам следует добавить свойство name к объекту и использовать его вместо этого.

0 голосов
/ 24 июня 2018

Вы можете использовать window объект для доступа к thisObject и thisArray

Как это -

var thisObject={ first:1, second:2};
var thisArray=[1,2,3,4]

console.log(window.hasOwnProperty("thisObject"));
console.log(window.hasOwnProperty("thisArray"));

console.log(window.thisObject);
console.log(window["thisArray"]);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...